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