File indexing completed on 2024-05-12 04:45:53

0001 /*
0002 Copyright (C) 2001 - 2013 Evan Teran
0003                           evan.teran@gmail.com
0004 
0005 This program is free software: you can redistribute it and/or modify
0006 it under the terms of the GNU General Public License as published by
0007 the Free Software Foundation, either version 2 of the License, or
0008 (at your option) any later version.
0009 
0010 This program is distributed in the hope that it will be useful,
0011 but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 GNU General Public License for more details.
0014 
0015 You should have received a copy of the GNU General Public License
0016 along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017 */
0018 
0019 #ifndef KNUMBER_FLOAT_H_
0020 #define KNUMBER_FLOAT_H_
0021 
0022 #include <config-kcalc.h>
0023 #include "knumber_base.h"
0024 
0025 class KNumber;
0026 
0027 namespace detail {
0028 
0029 class knumber_float : public knumber_base {
0030     friend class ::KNumber;
0031     friend class knumber_error;
0032     friend class knumber_integer;
0033     friend class knumber_fraction;
0034 
0035 private:
0036     static const mpfr_rnd_t  rounding_mode;
0037     static const mpfr_prec_t precision;
0038 
0039 public:
0040     explicit knumber_float(const QString &s);
0041     explicit knumber_float(double value);
0042 #ifdef HAVE_LONG_DOUBLE
0043     explicit knumber_float(long double value);
0044 #endif
0045 
0046     explicit knumber_float(mpfr_t mpfr);
0047     ~knumber_float() override;
0048 
0049 private:
0050     // conversion constructors
0051     explicit knumber_float(const knumber_integer *value);
0052     explicit knumber_float(const knumber_fraction *value);
0053     explicit knumber_float(const knumber_float *value);
0054     explicit knumber_float(const knumber_error *value);
0055 
0056 public:
0057     QString toString(int precision) const override;
0058     QString toBinaryString(int precision) const override;
0059     QString toHexString(int precision) const override;
0060     quint64 toUint64() const override;
0061     qint64 toInt64() const override;
0062 
0063 public:
0064     bool is_integer() const override;
0065     bool is_zero() const override;
0066     int sign() const override;
0067 
0068 public:
0069     knumber_base *add(knumber_base *rhs) override;
0070     knumber_base *sub(knumber_base *rhs) override;
0071     knumber_base *mul(knumber_base *rhs) override;
0072     knumber_base *div(knumber_base *rhs) override;
0073     knumber_base *mod(knumber_base *rhs) override;
0074 
0075 public:
0076     knumber_base *pow(knumber_base *rhs) override;
0077     knumber_base *neg() override;
0078     knumber_base *cmp() override;
0079     knumber_base *abs() override;
0080     knumber_base *sqrt() override;
0081     knumber_base *cbrt() override;
0082     knumber_base *factorial() override;
0083     knumber_base *reciprocal() override;
0084     knumber_base *tgamma() override;
0085 
0086 public:
0087     knumber_base *log2() override;
0088     knumber_base *log10() override;
0089     knumber_base *ln() override;
0090     knumber_base *floor() override;
0091     knumber_base *ceil() override;
0092     knumber_base *exp2() override;
0093     knumber_base *exp10() override;
0094     knumber_base *exp() override;
0095     knumber_base *bin(knumber_base *rhs) override;
0096 
0097 public:
0098     knumber_base *sin() override;
0099     knumber_base *cos() override;
0100     knumber_base *tan() override;
0101     knumber_base *asin() override;
0102     knumber_base *acos() override;
0103     knumber_base *atan() override;
0104     knumber_base *sinh() override;
0105     knumber_base *cosh() override;
0106     knumber_base *tanh() override;
0107     knumber_base *asinh() override;
0108     knumber_base *acosh() override;
0109     knumber_base *atanh() override;
0110 
0111 public:
0112     int compare(knumber_base *rhs) override;
0113 
0114 public:
0115     knumber_base *bitwise_and(knumber_base *rhs) override;
0116     knumber_base *bitwise_xor(knumber_base *rhs) override;
0117     knumber_base *bitwise_or(knumber_base *rhs) override;
0118     knumber_base *bitwise_shift(knumber_base *rhs) override;
0119 
0120 public:
0121     knumber_base *clone() override;
0122 
0123 private:
0124     knumber_base *ensureIsValid(mpfr_ptr mpfr);
0125 
0126     template <int F(mpfr_ptr rop, mpfr_srcptr op)>
0127     knumber_base *execute_mpfr_func();
0128 
0129     template <int F(mpfr_ptr rop, mpfr_srcptr op, mpfr_rnd_t rnd)>
0130     knumber_base *execute_mpfr_func();
0131 
0132     template <int F(mpfr_ptr rop, mpfr_srcptr op1, mpfr_srcptr op2, mpfr_rnd_t rnd)>
0133     knumber_base *execute_mpfr_func(mpfr_srcptr op);
0134 
0135     mpfr_ptr new_mpfr();
0136 
0137 private:
0138     mpfr_t mpfr_;
0139 };
0140 
0141 }
0142 
0143 #endif