1/*
2 SPDX-FileCopyrightText: 2001-2013 Evan Teran <evan.teran@gmail.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#pragma once
8
9#include "knumber_operators.h"
10#include <QString>
11
12namespace detail
13{
14class knumber_base;
15}
16
17class KNumber
18{
19private:
20 friend bool operator==(const KNumber &lhs, const KNumber &rhs);
21 friend bool operator!=(const KNumber &lhs, const KNumber &rhs);
22 friend bool operator>=(const KNumber &lhs, const KNumber &rhs);
23 friend bool operator<=(const KNumber &lhs, const KNumber &rhs);
24 friend bool operator>(const KNumber &lhs, const KNumber &rhs);
25 friend bool operator<(const KNumber &lhs, const KNumber &rhs);
26
27public:
28 enum Type { TYPE_ERROR, TYPE_INTEGER, TYPE_FLOAT, TYPE_FRACTION };
29
30public:
31 // useful constants
32 static const KNumber Zero;
33 static const KNumber One;
34 static const KNumber NegOne;
35 static const KNumber PosInfinity;
36 static const KNumber NegInfinity;
37 static const KNumber NaN;
38
39public:
40 static KNumber Pi();
41 static KNumber Euler();
42
43public:
44 // construction/destruction
45 KNumber();
46 explicit KNumber(const QString &s);
47
48 explicit KNumber(qint32 value);
49 explicit KNumber(qint64 value);
50 explicit KNumber(quint32 value);
51 explicit KNumber(quint64 value);
52
53 KNumber(qint64 num, quint64 den);
54 KNumber(quint64 num, quint64 den);
55
56#ifdef HAVE_LONG_DOUBLE
57 explicit KNumber(long double value);
58#endif
59 explicit KNumber(double value);
60
61 KNumber(const KNumber &other);
62 ~KNumber();
63
64public:
65 Type type() const;
66
67public:
68 // assignment
69 KNumber &operator=(const KNumber &rhs);
70
71public:
72 // basic math operators
73 KNumber &operator+=(const KNumber &rhs);
74 KNumber &operator-=(const KNumber &rhs);
75 KNumber &operator*=(const KNumber &rhs);
76 KNumber &operator/=(const KNumber &rhs);
77 KNumber &operator%=(const KNumber &rhs);
78
79public:
80 // bitwise operators
81 KNumber &operator&=(const KNumber &rhs);
82 KNumber &operator|=(const KNumber &rhs);
83 KNumber &operator^=(const KNumber &rhs);
84 KNumber &operator<<=(const KNumber &rhs);
85 KNumber &operator>>=(const KNumber &rhs);
86
87public:
88 // neg/cmp
89 KNumber operator-() const;
90 KNumber operator~() const;
91
92public:
93 KNumber integerPart() const;
94
95public:
96 QString toQString(int width = -1, int precision = -1) const;
97 quint64 toUint64() const;
98 qint64 toInt64() const;
99
100public:
101 KNumber abs() const;
102 KNumber cbrt() const;
103 KNumber sqrt() const;
104 KNumber pow(const KNumber &x) const;
105
106 KNumber sin() const;
107 KNumber cos() const;
108 KNumber tan() const;
109 KNumber asin() const;
110 KNumber acos() const;
111 KNumber atan() const;
112 KNumber sinh() const;
113 KNumber cosh() const;
114 KNumber tanh() const;
115 KNumber asinh() const;
116 KNumber acosh() const;
117 KNumber atanh() const;
118 KNumber tgamma() const;
119
120 KNumber factorial() const;
121
122 KNumber log2() const;
123 KNumber log10() const;
124 KNumber ln() const;
125 KNumber floor() const;
126 KNumber ceil() const;
127 KNumber exp2() const;
128 KNumber exp10() const;
129 KNumber exp() const;
130 KNumber bin(const KNumber &x) const;
131
132public:
133 static void setDefaultFloatPrecision(int precision);
134 static void setSplitoffIntegerForFractionOutput(bool x);
135 static void setDefaultFractionalInput(bool x);
136 static void setDefaultFloatOutput(bool x);
137 static void setGroupSeparator(const QString &ch);
138 static void setDecimalSeparator(const QString &ch);
139
140 static QString groupSeparator();
141 static QString decimalSeparator();
142
143public:
144 void swap(KNumber &other);
145
146private:
147 void simplify();
148
149private:
150 detail::knumber_base *value_;
151
152private:
153 static QString GroupSeparator;
154 static QString DecimalSeparator;
155};
156
157

source code of kcalc/knumber/knumber.h