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