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