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