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