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