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