File indexing completed on 2024-05-12 04:45:53

0001 /*
0002 Copyright (C) 2001 - 2013 Evan Teran
0003                           evan.teran@gmail.com
0004 
0005 This program is free software: you can redistribute it and/or modify
0006 it under the terms of the GNU General Public License as published by
0007 the Free Software Foundation, either version 2 of the License, or
0008 (at your option) any later version.
0009 
0010 This program is distributed in the hope that it will be useful,
0011 but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 GNU General Public License for more details.
0014 
0015 You should have received a copy of the GNU General Public License
0016 along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017 */
0018 
0019 #ifndef KNUMBER_FRACTION_H_
0020 #define KNUMBER_FRACTION_H_
0021 
0022 #include "knumber_base.h"
0023 
0024 class KNumber;
0025 
0026 namespace detail {
0027 
0028 class knumber_fraction : public knumber_base {
0029     friend class ::KNumber;
0030     friend class knumber_error;
0031     friend class knumber_integer;
0032     friend class knumber_float;
0033 
0034 public:
0035     static bool default_fractional_input;
0036     static bool default_fractional_output;
0037     static bool split_off_integer_for_fraction_output;
0038 
0039 public:
0040     static void set_default_fractional_input(bool value);
0041     static void set_default_fractional_output(bool value);
0042     static void set_split_off_integer_for_fraction_output(bool value);
0043 
0044 public:
0045     explicit knumber_fraction(const QString &s);
0046     knumber_fraction(qint64 num, quint64 den);
0047     knumber_fraction(quint64 num, quint64 den);
0048     explicit knumber_fraction(mpq_t mpq);
0049     ~knumber_fraction() override;
0050 
0051 public:
0052     knumber_base *clone() override;
0053 
0054 public:
0055     QString toString(int precision) const override;
0056     QString toBinaryString(int precision) const override;
0057     QString toHexString(int precision) const override;
0058     quint64 toUint64() const override;
0059     qint64 toInt64() const override;
0060 
0061 public:
0062     bool is_integer() const override;
0063     bool is_zero() const override;
0064     int sign() const override;
0065 
0066 public:
0067     knumber_base *add(knumber_base *rhs) override;
0068     knumber_base *sub(knumber_base *rhs) override;
0069     knumber_base *mul(knumber_base *rhs) override;
0070     knumber_base *div(knumber_base *rhs) override;
0071     knumber_base *mod(knumber_base *rhs) override;
0072 
0073 public:
0074     knumber_base *bitwise_and(knumber_base *rhs) override;
0075     knumber_base *bitwise_xor(knumber_base *rhs) override;
0076     knumber_base *bitwise_or(knumber_base *rhs) override;
0077     knumber_base *bitwise_shift(knumber_base *rhs) override;
0078 
0079 public:
0080     knumber_base *pow(knumber_base *rhs) override;
0081     knumber_base *neg() override;
0082     knumber_base *cmp() override;
0083     knumber_base *abs() override;
0084     knumber_base *sqrt() override;
0085     knumber_base *cbrt() override;
0086     knumber_base *factorial() override;
0087     knumber_base *reciprocal() override;
0088     knumber_base *tgamma() override;
0089 
0090 public:
0091     knumber_base *log2() override;
0092     knumber_base *log10() override;
0093     knumber_base *ln() override;
0094     knumber_base *exp2() override;
0095     knumber_base *floor() override;
0096     knumber_base *ceil() override;
0097     knumber_base *exp10() override;
0098     knumber_base *exp() override;
0099     knumber_base *bin(knumber_base *rhs) override;
0100 
0101 public:
0102     knumber_base *sin() override;
0103     knumber_base *cos() override;
0104     knumber_base *tan() override;
0105     knumber_base *asin() override;
0106     knumber_base *acos() override;
0107     knumber_base *atan() override;
0108     knumber_base *sinh() override;
0109     knumber_base *cosh() override;
0110     knumber_base *tanh() override;
0111     knumber_base *asinh() override;
0112     knumber_base *acosh() override;
0113     knumber_base *atanh() override;
0114 
0115 public:
0116     int compare(knumber_base *rhs) override;
0117 
0118 private:
0119     knumber_integer *numerator() const;
0120     knumber_integer *denominator() const;
0121 
0122 private:
0123     // conversion constructors
0124     explicit knumber_fraction(const knumber_integer *value);
0125     explicit knumber_fraction(const knumber_fraction *value);
0126 #if 0
0127     // TODO: this is omitted because there is no good way to
0128     // implement it
0129     knumber_fraction(const knumber_float *value);
0130 #endif
0131     explicit knumber_fraction(const knumber_error *value);
0132 
0133 private:
0134     mpq_t mpq_;
0135 };
0136 
0137 }
0138 
0139 #endif