File indexing completed on 2024-05-12 17:21:05

0001 // SPDX-FileCopyrightText: 2001-2013 Evan Teran <evan.teran@gmail.com>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 #ifndef KNUMBER_FRACTION_H_
0005 #define KNUMBER_FRACTION_H_
0006 
0007 #include "knumber_base.h"
0008 
0009 class KNumber;
0010 
0011 namespace detail {
0012 
0013 class knumber_fraction : public knumber_base {
0014     friend class ::KNumber;
0015     friend class knumber_error;
0016     friend class knumber_integer;
0017     friend class knumber_float;
0018 
0019 public:
0020     static bool default_fractional_input;
0021     static bool default_fractional_output;
0022     static bool split_off_integer_for_fraction_output;
0023 
0024 public:
0025     static void set_default_fractional_input(bool value);
0026     static void set_default_fractional_output(bool value);
0027     static void set_split_off_integer_for_fraction_output(bool value);
0028 
0029 public:
0030     explicit knumber_fraction(const QString &s);
0031     knumber_fraction(qint64 num, quint64 den);
0032     knumber_fraction(quint64 num, quint64 den);
0033     explicit knumber_fraction(mpq_t mpq);
0034     ~knumber_fraction() override;
0035 
0036 public:
0037     knumber_base *clone() override;
0038 
0039 public:
0040     QString toString(int precision) const override;
0041     QString toBinaryString(int precision) const override;
0042     QString toHexString(int precision) const override;
0043     quint64 toUint64() const override;
0044     qint64 toInt64() const override;
0045 
0046 public:
0047     bool is_integer() const override;
0048     bool is_zero() const override;
0049     int sign() const override;
0050 
0051 public:
0052     knumber_base *add(knumber_base *rhs) override;
0053     knumber_base *sub(knumber_base *rhs) override;
0054     knumber_base *mul(knumber_base *rhs) override;
0055     knumber_base *div(knumber_base *rhs) override;
0056     knumber_base *mod(knumber_base *rhs) override;
0057 
0058 public:
0059     knumber_base *bitwise_and(knumber_base *rhs) override;
0060     knumber_base *bitwise_xor(knumber_base *rhs) override;
0061     knumber_base *bitwise_or(knumber_base *rhs) override;
0062     knumber_base *bitwise_shift(knumber_base *rhs) override;
0063 
0064 public:
0065     knumber_base *pow(knumber_base *rhs) override;
0066     knumber_base *neg() override;
0067     knumber_base *cmp() override;
0068     knumber_base *abs() override;
0069     knumber_base *sqrt() override;
0070     knumber_base *cbrt() override;
0071     knumber_base *factorial() override;
0072     knumber_base *reciprocal() override;
0073     knumber_base *tgamma() override;
0074 
0075 public:
0076     knumber_base *log2() override;
0077     knumber_base *log10() override;
0078     knumber_base *ln() override;
0079     knumber_base *exp2() override;
0080     knumber_base *floor() override;
0081     knumber_base *ceil() override;
0082     knumber_base *exp10() override;
0083     knumber_base *exp() override;
0084     knumber_base *bin(knumber_base *rhs) override;
0085 
0086 public:
0087     knumber_base *sin() override;
0088     knumber_base *cos() override;
0089     knumber_base *tan() override;
0090     knumber_base *asin() override;
0091     knumber_base *acos() override;
0092     knumber_base *atan() override;
0093     knumber_base *sinh() override;
0094     knumber_base *cosh() override;
0095     knumber_base *tanh() override;
0096     knumber_base *asinh() override;
0097     knumber_base *acosh() override;
0098     knumber_base *atanh() override;
0099 
0100 public:
0101     int compare(knumber_base *rhs) override;
0102 
0103 private:
0104     knumber_integer *numerator() const;
0105     knumber_integer *denominator() const;
0106 
0107 private:
0108     // conversion constructors
0109     explicit knumber_fraction(const knumber_integer *value);
0110     explicit knumber_fraction(const knumber_fraction *value);
0111 #if 0
0112     // TODO: this is omitted because there is no good way to
0113     // implement it
0114     knumber_fraction(const knumber_float *value);
0115 #endif
0116     explicit knumber_fraction(const knumber_error *value);
0117 
0118 private:
0119     mpq_t mpq_;
0120 };
0121 
0122 }
0123 
0124 #endif