File indexing completed on 2024-05-12 17:21:05
0001 // SPDX-FileCopyrightText: 2001-2013 Evan Teran <evan.teran@gmail.com> 0002 // SPDX-License-Identifier: GPL-2.0-or-later 0003 0004 #ifndef KNUMBER_FLOAT_H_ 0005 #define KNUMBER_FLOAT_H_ 0006 0007 #include <config-kcalc.h> 0008 #include "knumber_base.h" 0009 0010 class KNumber; 0011 0012 namespace detail { 0013 0014 class knumber_float : public knumber_base { 0015 friend class ::KNumber; 0016 friend class knumber_error; 0017 friend class knumber_integer; 0018 friend class knumber_fraction; 0019 0020 private: 0021 static const mpfr_rnd_t rounding_mode; 0022 static const mpfr_prec_t precision; 0023 0024 public: 0025 explicit knumber_float(const QString &s); 0026 explicit knumber_float(double value); 0027 #ifdef HAVE_LONG_DOUBLE 0028 explicit knumber_float(long double value); 0029 #endif 0030 0031 explicit knumber_float(mpfr_t mpfr); 0032 ~knumber_float() override; 0033 0034 private: 0035 // conversion constructors 0036 explicit knumber_float(const knumber_integer *value); 0037 explicit knumber_float(const knumber_fraction *value); 0038 explicit knumber_float(const knumber_float *value); 0039 explicit knumber_float(const knumber_error *value); 0040 0041 public: 0042 QString toString(int precision) const override; 0043 QString toBinaryString(int precision) const override; 0044 QString toHexString(int precision) const override; 0045 quint64 toUint64() const override; 0046 qint64 toInt64() const override; 0047 0048 public: 0049 bool is_integer() const override; 0050 bool is_zero() const override; 0051 int sign() const override; 0052 0053 public: 0054 knumber_base *add(knumber_base *rhs) override; 0055 knumber_base *sub(knumber_base *rhs) override; 0056 knumber_base *mul(knumber_base *rhs) override; 0057 knumber_base *div(knumber_base *rhs) override; 0058 knumber_base *mod(knumber_base *rhs) override; 0059 0060 public: 0061 knumber_base *pow(knumber_base *rhs) override; 0062 knumber_base *neg() override; 0063 knumber_base *cmp() override; 0064 knumber_base *abs() override; 0065 knumber_base *sqrt() override; 0066 knumber_base *cbrt() override; 0067 knumber_base *factorial() override; 0068 knumber_base *reciprocal() override; 0069 knumber_base *tgamma() override; 0070 0071 public: 0072 knumber_base *log2() override; 0073 knumber_base *log10() override; 0074 knumber_base *ln() override; 0075 knumber_base *floor() override; 0076 knumber_base *ceil() override; 0077 knumber_base *exp2() override; 0078 knumber_base *exp10() override; 0079 knumber_base *exp() override; 0080 knumber_base *bin(knumber_base *rhs) override; 0081 0082 public: 0083 knumber_base *sin() override; 0084 knumber_base *cos() override; 0085 knumber_base *tan() override; 0086 knumber_base *asin() override; 0087 knumber_base *acos() override; 0088 knumber_base *atan() override; 0089 knumber_base *sinh() override; 0090 knumber_base *cosh() override; 0091 knumber_base *tanh() override; 0092 knumber_base *asinh() override; 0093 knumber_base *acosh() override; 0094 knumber_base *atanh() override; 0095 0096 public: 0097 int compare(knumber_base *rhs) override; 0098 0099 public: 0100 knumber_base *bitwise_and(knumber_base *rhs) override; 0101 knumber_base *bitwise_xor(knumber_base *rhs) override; 0102 knumber_base *bitwise_or(knumber_base *rhs) override; 0103 knumber_base *bitwise_shift(knumber_base *rhs) override; 0104 0105 public: 0106 knumber_base *clone() override; 0107 0108 private: 0109 knumber_base *ensureIsValid(mpfr_ptr mpfr); 0110 0111 template <int F(mpfr_ptr rop, mpfr_srcptr op)> 0112 knumber_base *execute_mpfr_func(); 0113 0114 template <int F(mpfr_ptr rop, mpfr_srcptr op, mpfr_rnd_t rnd)> 0115 knumber_base *execute_mpfr_func(); 0116 0117 template <int F(mpfr_ptr rop, mpfr_srcptr op1, mpfr_srcptr op2, mpfr_rnd_t rnd)> 0118 knumber_base *execute_mpfr_func(mpfr_srcptr op); 0119 0120 mpfr_ptr new_mpfr(); 0121 0122 private: 0123 mpfr_t mpfr_; 0124 }; 0125 0126 } 0127 0128 #endif