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