File indexing completed on 2024-05-12 17:21:04
0001 // SPDX-FileCopyrightText: 2001-2013 Evan Teran <evan.teran@gmail.com> 0002 // SPDX-License-Identifier: GPL-2.0-or-later 0003 0004 #ifndef KNUMBER_H_ 0005 #define KNUMBER_H_ 0006 0007 #include "knumber_operators.h" 0008 #include <QString> 0009 #include <config-kcalc.h> 0010 0011 namespace detail { 0012 class knumber_base; 0013 } 0014 0015 class KNumber { 0016 private: 0017 friend bool operator==(const KNumber &lhs, const KNumber &rhs); 0018 friend bool operator!=(const KNumber &lhs, const KNumber &rhs); 0019 friend bool operator>=(const KNumber &lhs, const KNumber &rhs); 0020 friend bool operator<=(const KNumber &lhs, const KNumber &rhs); 0021 friend bool operator>(const KNumber &lhs, const KNumber &rhs); 0022 friend bool operator<(const KNumber &lhs, const KNumber &rhs); 0023 0024 public: 0025 enum Type { 0026 TYPE_ERROR, 0027 TYPE_INTEGER, 0028 TYPE_FLOAT, 0029 TYPE_FRACTION 0030 }; 0031 0032 public: 0033 // useful constants 0034 static const KNumber Zero; 0035 static const KNumber One; 0036 static const KNumber NegOne; 0037 static const KNumber PosInfinity; 0038 static const KNumber NegInfinity; 0039 static const KNumber NaN; 0040 0041 public: 0042 static KNumber Pi(); 0043 static KNumber Euler(); 0044 0045 public: 0046 // construction/destruction 0047 static KNumber binaryFromString(const QString &s); 0048 KNumber(); 0049 explicit KNumber(const QString &s); 0050 explicit KNumber(qint32 value); 0051 explicit KNumber(qint64 value); 0052 explicit KNumber(quint32 value); 0053 explicit KNumber(quint64 value); 0054 0055 KNumber(qint64 num, quint64 den); 0056 KNumber(quint64 num, quint64 den); 0057 0058 #ifdef HAVE_LONG_DOUBLE 0059 explicit KNumber(long double value); 0060 #endif 0061 explicit KNumber(double value); 0062 0063 KNumber(const KNumber &other); 0064 ~KNumber(); 0065 0066 public: 0067 Type type() const; 0068 0069 public: 0070 // assignment 0071 KNumber &operator=(const KNumber &rhs); 0072 0073 public: 0074 // basic math operators 0075 KNumber &operator+=(const KNumber &rhs); 0076 KNumber &operator-=(const KNumber &rhs); 0077 KNumber &operator*=(const KNumber &rhs); 0078 KNumber &operator/=(const KNumber &rhs); 0079 KNumber &operator%=(const KNumber &rhs); 0080 0081 public: 0082 // bitwise operators 0083 KNumber &operator&=(const KNumber &rhs); 0084 KNumber &operator|=(const KNumber &rhs); 0085 KNumber &operator^=(const KNumber &rhs); 0086 KNumber &operator<<=(const KNumber &rhs); 0087 KNumber &operator>>=(const KNumber &rhs); 0088 0089 public: 0090 // neg/cmp 0091 KNumber operator-() const; 0092 KNumber operator~() const; 0093 0094 public: 0095 KNumber integerPart() const; 0096 0097 public: 0098 QString toQString(int width = 64, int precision = -1) const; 0099 QString toBinaryString(int precision) const; 0100 QString toHexString(int precision) const; 0101 quint64 toUint64() const; 0102 qint64 toInt64() const; 0103 0104 0105 public: 0106 KNumber abs() const; 0107 KNumber cbrt() const; 0108 KNumber sqrt() const; 0109 KNumber pow(const KNumber &x) const; 0110 0111 KNumber sin() const; 0112 KNumber cos() const; 0113 KNumber tan() const; 0114 KNumber asin() const; 0115 KNumber acos() const; 0116 KNumber atan() const; 0117 KNumber sinh() const; 0118 KNumber cosh() const; 0119 KNumber tanh() const; 0120 KNumber asinh() const; 0121 KNumber acosh() const; 0122 KNumber atanh() const; 0123 KNumber tgamma() const; 0124 0125 KNumber factorial() const; 0126 0127 KNumber log2() const; 0128 KNumber log10() const; 0129 KNumber ln() const; 0130 KNumber floor() const; 0131 KNumber ceil() const; 0132 KNumber exp2() const; 0133 KNumber exp10() const; 0134 KNumber exp() const; 0135 KNumber bin(const KNumber &x) const; 0136 0137 public: 0138 static void setDefaultFloatPrecision(int precision); 0139 static void setSplitoffIntegerForFractionOutput(bool x); 0140 static void setDefaultFractionalInput(bool x); 0141 static void setDefaultFloatOutput(bool x); 0142 static void setGroupSeparator(const QString &ch); 0143 static void setDecimalSeparator(const QString &ch); 0144 0145 static QString groupSeparator(); 0146 static QString decimalSeparator(); 0147 0148 public: 0149 void swap(KNumber &other); 0150 0151 private: 0152 void simplify(); 0153 0154 private: 0155 detail::knumber_base *value_; 0156 0157 private: 0158 static QString GroupSeparator; 0159 static QString DecimalSeparator; 0160 }; 0161 0162 #endif