File indexing completed on 2024-03-24 05:52:53
0001 /* 0002 SPDX-FileCopyrightText: 2001-2013 Evan Teran <evan.teran@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include "knumber_operators.h" 0010 #include <QString> 0011 0012 namespace detail 0013 { 0014 class knumber_base; 0015 } 0016 0017 class KNumber 0018 { 0019 private: 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 friend bool operator<=(const KNumber &lhs, const KNumber &rhs); 0024 friend bool operator>(const KNumber &lhs, const KNumber &rhs); 0025 friend bool operator<(const KNumber &lhs, const KNumber &rhs); 0026 0027 public: 0028 enum Type { TYPE_ERROR, TYPE_INTEGER, TYPE_FLOAT, TYPE_FRACTION }; 0029 0030 public: 0031 // useful constants 0032 static const KNumber Zero; 0033 static const KNumber One; 0034 static const KNumber NegOne; 0035 static const KNumber OneHundred; 0036 static const KNumber OneThousand; 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 KNumber(); 0048 explicit KNumber(const QString &s); 0049 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 = -1, int precision = -1) const; 0099 quint64 toUint64() const; 0100 qint64 toInt64() const; 0101 0102 public: 0103 KNumber abs() const; 0104 KNumber cbrt() const; 0105 KNumber sqrt() const; 0106 KNumber pow(const KNumber &x) const; 0107 0108 KNumber sin() const; 0109 KNumber cos() const; 0110 KNumber tan() const; 0111 KNumber asin() const; 0112 KNumber acos() const; 0113 KNumber atan() const; 0114 KNumber sinh() const; 0115 KNumber cosh() const; 0116 KNumber tanh() const; 0117 KNumber asinh() const; 0118 KNumber acosh() const; 0119 KNumber atanh() const; 0120 KNumber tgamma() const; 0121 0122 KNumber factorial() const; 0123 0124 KNumber log2() const; 0125 KNumber log10() const; 0126 KNumber ln() const; 0127 KNumber floor() const; 0128 KNumber ceil() const; 0129 KNumber exp2() const; 0130 KNumber exp10() const; 0131 KNumber exp() const; 0132 KNumber bin(const KNumber &x) const; 0133 0134 public: 0135 static void setDefaultFloatPrecision(int precision); 0136 static void setSplitoffIntegerForFractionOutput(bool x); 0137 static void setDefaultFractionalInput(bool x); 0138 static void setDefaultFloatOutput(bool x); 0139 static void setGroupSeparator(const QString &ch); 0140 static void setDecimalSeparator(const QString &ch); 0141 0142 static QString groupSeparator(); 0143 static QString decimalSeparator(); 0144 0145 public: 0146 void swap(KNumber &other); 0147 0148 private: 0149 void simplify(); 0150 0151 private: 0152 detail::knumber_base *value_; 0153 0154 private: 0155 static QString GroupSeparator; 0156 static QString DecimalSeparator; 0157 }; 0158