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_BASE_H_ 0005 #define KNUMBER_BASE_H_ 0006 0007 // Workaround: include before gmp.h to fix build with gcc-4.9 0008 #include <cstddef> 0009 #include <gmp.h> 0010 #include <mpfr.h> 0011 0012 #include <QString> 0013 0014 namespace detail { 0015 0016 class knumber_error; 0017 class knumber_integer; 0018 class knumber_fraction; 0019 class knumber_float; 0020 0021 class knumber_base { 0022 public: 0023 virtual ~knumber_base() = default; 0024 0025 public: 0026 virtual knumber_base *clone() = 0; 0027 0028 public: 0029 virtual QString toString(int precision) const = 0; 0030 virtual QString toBinaryString(int precision) const = 0; 0031 virtual QString toHexString(int precision) const = 0; 0032 virtual quint64 toUint64() const = 0; 0033 virtual qint64 toInt64() const = 0; 0034 0035 public: 0036 virtual bool is_integer() const = 0; 0037 virtual bool is_zero() const = 0; 0038 virtual int sign() const = 0; 0039 0040 public: 0041 // basic math 0042 virtual knumber_base *add(knumber_base *rhs) = 0; 0043 virtual knumber_base *sub(knumber_base *rhs) = 0; 0044 virtual knumber_base *mul(knumber_base *rhs) = 0; 0045 virtual knumber_base *div(knumber_base *rhs) = 0; 0046 virtual knumber_base *mod(knumber_base *rhs) = 0; 0047 0048 public: 0049 // logical operators 0050 virtual knumber_base *bitwise_and(knumber_base *rhs) = 0; 0051 virtual knumber_base *bitwise_xor(knumber_base *rhs) = 0; 0052 virtual knumber_base *bitwise_or(knumber_base *rhs) = 0; 0053 virtual knumber_base *bitwise_shift(knumber_base *rhs) = 0; 0054 0055 public: 0056 // algebraic functions 0057 virtual knumber_base *pow(knumber_base *rhs) = 0; 0058 virtual knumber_base *neg() = 0; 0059 virtual knumber_base *cmp() = 0; 0060 virtual knumber_base *abs() = 0; 0061 virtual knumber_base *sqrt() = 0; 0062 virtual knumber_base *cbrt() = 0; 0063 virtual knumber_base *factorial() = 0; 0064 virtual knumber_base *reciprocal() = 0; 0065 0066 public: 0067 // special functions 0068 virtual knumber_base *log2() = 0; 0069 virtual knumber_base *log10() = 0; 0070 virtual knumber_base *ln() = 0; 0071 virtual knumber_base *exp2() = 0; 0072 virtual knumber_base *exp10() = 0; 0073 virtual knumber_base *floor() = 0; 0074 virtual knumber_base *ceil() = 0; 0075 virtual knumber_base *exp() = 0; 0076 virtual knumber_base *bin(knumber_base *rhs) = 0; 0077 0078 public: 0079 // trig functions 0080 virtual knumber_base *sin() = 0; 0081 virtual knumber_base *cos() = 0; 0082 virtual knumber_base *tan() = 0; 0083 virtual knumber_base *asin() = 0; 0084 virtual knumber_base *acos() = 0; 0085 virtual knumber_base *atan() = 0; 0086 virtual knumber_base *sinh() = 0; 0087 virtual knumber_base *cosh() = 0; 0088 virtual knumber_base *tanh() = 0; 0089 virtual knumber_base *asinh() = 0; 0090 virtual knumber_base *acosh() = 0; 0091 virtual knumber_base *atanh() = 0; 0092 virtual knumber_base *tgamma() = 0; 0093 0094 public: 0095 // comparison 0096 virtual int compare(knumber_base *rhs) = 0; 0097 }; 0098 0099 } 0100 0101 #endif