File indexing completed on 2024-04-28 09:45:22
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 PosInfinity; 0036 static const KNumber NegInfinity; 0037 static const KNumber NaN; 0038 0039 public: 0040 static KNumber Pi(); 0041 static KNumber Euler(); 0042 0043 public: 0044 // construction/destruction 0045 KNumber(); 0046 explicit KNumber(const QString &s); 0047 0048 explicit KNumber(qint32 value); 0049 explicit KNumber(qint64 value); 0050 explicit KNumber(quint32 value); 0051 explicit KNumber(quint64 value); 0052 0053 KNumber(qint64 num, quint64 den); 0054 KNumber(quint64 num, quint64 den); 0055 0056 #ifdef HAVE_LONG_DOUBLE 0057 explicit KNumber(long double value); 0058 #endif 0059 explicit KNumber(double value); 0060 0061 KNumber(const KNumber &other); 0062 ~KNumber(); 0063 0064 public: 0065 Type type() const; 0066 0067 public: 0068 // assignment 0069 KNumber &operator=(const KNumber &rhs); 0070 0071 public: 0072 // basic math operators 0073 KNumber &operator+=(const KNumber &rhs); 0074 KNumber &operator-=(const KNumber &rhs); 0075 KNumber &operator*=(const KNumber &rhs); 0076 KNumber &operator/=(const KNumber &rhs); 0077 KNumber &operator%=(const KNumber &rhs); 0078 0079 public: 0080 // bitwise operators 0081 KNumber &operator&=(const KNumber &rhs); 0082 KNumber &operator|=(const KNumber &rhs); 0083 KNumber &operator^=(const KNumber &rhs); 0084 KNumber &operator<<=(const KNumber &rhs); 0085 KNumber &operator>>=(const KNumber &rhs); 0086 0087 public: 0088 // neg/cmp 0089 KNumber operator-() const; 0090 KNumber operator~() const; 0091 0092 public: 0093 KNumber integerPart() const; 0094 0095 public: 0096 QString toQString(int width = -1, int precision = -1) const; 0097 quint64 toUint64() const; 0098 qint64 toInt64() const; 0099 0100 public: 0101 KNumber abs() const; 0102 KNumber cbrt() const; 0103 KNumber sqrt() const; 0104 KNumber pow(const KNumber &x) const; 0105 0106 KNumber sin() const; 0107 KNumber cos() const; 0108 KNumber tan() const; 0109 KNumber asin() const; 0110 KNumber acos() const; 0111 KNumber atan() const; 0112 KNumber sinh() const; 0113 KNumber cosh() const; 0114 KNumber tanh() const; 0115 KNumber asinh() const; 0116 KNumber acosh() const; 0117 KNumber atanh() const; 0118 KNumber tgamma() const; 0119 0120 KNumber factorial() const; 0121 0122 KNumber log2() const; 0123 KNumber log10() const; 0124 KNumber ln() const; 0125 KNumber floor() const; 0126 KNumber ceil() const; 0127 KNumber exp2() const; 0128 KNumber exp10() const; 0129 KNumber exp() const; 0130 KNumber bin(const KNumber &x) const; 0131 0132 public: 0133 static void setDefaultFloatPrecision(int precision); 0134 static void setSplitoffIntegerForFractionOutput(bool x); 0135 static void setDefaultFractionalInput(bool x); 0136 static void setDefaultFloatOutput(bool x); 0137 static void setGroupSeparator(const QString &ch); 0138 static void setDecimalSeparator(const QString &ch); 0139 0140 static QString groupSeparator(); 0141 static QString decimalSeparator(); 0142 0143 public: 0144 void swap(KNumber &other); 0145 0146 private: 0147 void simplify(); 0148 0149 private: 0150 detail::knumber_base *value_; 0151 0152 private: 0153 static QString GroupSeparator; 0154 static QString DecimalSeparator; 0155 }; 0156