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_FRACTION_H_ 0005 #define KNUMBER_FRACTION_H_ 0006 0007 #include "knumber_base.h" 0008 0009 class KNumber; 0010 0011 namespace detail { 0012 0013 class knumber_fraction : public knumber_base { 0014 friend class ::KNumber; 0015 friend class knumber_error; 0016 friend class knumber_integer; 0017 friend class knumber_float; 0018 0019 public: 0020 static bool default_fractional_input; 0021 static bool default_fractional_output; 0022 static bool split_off_integer_for_fraction_output; 0023 0024 public: 0025 static void set_default_fractional_input(bool value); 0026 static void set_default_fractional_output(bool value); 0027 static void set_split_off_integer_for_fraction_output(bool value); 0028 0029 public: 0030 explicit knumber_fraction(const QString &s); 0031 knumber_fraction(qint64 num, quint64 den); 0032 knumber_fraction(quint64 num, quint64 den); 0033 explicit knumber_fraction(mpq_t mpq); 0034 ~knumber_fraction() override; 0035 0036 public: 0037 knumber_base *clone() override; 0038 0039 public: 0040 QString toString(int precision) const override; 0041 QString toBinaryString(int precision) const override; 0042 QString toHexString(int precision) const override; 0043 quint64 toUint64() const override; 0044 qint64 toInt64() const override; 0045 0046 public: 0047 bool is_integer() const override; 0048 bool is_zero() const override; 0049 int sign() const override; 0050 0051 public: 0052 knumber_base *add(knumber_base *rhs) override; 0053 knumber_base *sub(knumber_base *rhs) override; 0054 knumber_base *mul(knumber_base *rhs) override; 0055 knumber_base *div(knumber_base *rhs) override; 0056 knumber_base *mod(knumber_base *rhs) override; 0057 0058 public: 0059 knumber_base *bitwise_and(knumber_base *rhs) override; 0060 knumber_base *bitwise_xor(knumber_base *rhs) override; 0061 knumber_base *bitwise_or(knumber_base *rhs) override; 0062 knumber_base *bitwise_shift(knumber_base *rhs) override; 0063 0064 public: 0065 knumber_base *pow(knumber_base *rhs) override; 0066 knumber_base *neg() override; 0067 knumber_base *cmp() override; 0068 knumber_base *abs() override; 0069 knumber_base *sqrt() override; 0070 knumber_base *cbrt() override; 0071 knumber_base *factorial() override; 0072 knumber_base *reciprocal() override; 0073 knumber_base *tgamma() override; 0074 0075 public: 0076 knumber_base *log2() override; 0077 knumber_base *log10() override; 0078 knumber_base *ln() override; 0079 knumber_base *exp2() override; 0080 knumber_base *floor() override; 0081 knumber_base *ceil() override; 0082 knumber_base *exp10() override; 0083 knumber_base *exp() override; 0084 knumber_base *bin(knumber_base *rhs) override; 0085 0086 public: 0087 knumber_base *sin() override; 0088 knumber_base *cos() override; 0089 knumber_base *tan() override; 0090 knumber_base *asin() override; 0091 knumber_base *acos() override; 0092 knumber_base *atan() override; 0093 knumber_base *sinh() override; 0094 knumber_base *cosh() override; 0095 knumber_base *tanh() override; 0096 knumber_base *asinh() override; 0097 knumber_base *acosh() override; 0098 knumber_base *atanh() override; 0099 0100 public: 0101 int compare(knumber_base *rhs) override; 0102 0103 private: 0104 knumber_integer *numerator() const; 0105 knumber_integer *denominator() const; 0106 0107 private: 0108 // conversion constructors 0109 explicit knumber_fraction(const knumber_integer *value); 0110 explicit knumber_fraction(const knumber_fraction *value); 0111 #if 0 0112 // TODO: this is omitted because there is no good way to 0113 // implement it 0114 knumber_fraction(const knumber_float *value); 0115 #endif 0116 explicit knumber_fraction(const knumber_error *value); 0117 0118 private: 0119 mpq_t mpq_; 0120 }; 0121 0122 } 0123 0124 #endif