2014-11-19 02:23:05 +00:00
|
|
|
/*
|
|
|
|
Copyright (C) 2001 - 2013 Evan Teran
|
|
|
|
evan.teran@gmail.com
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config-kcalc.h>
|
|
|
|
#include "knumber_integer.h"
|
|
|
|
#include "knumber_float.h"
|
|
|
|
#include "knumber_fraction.h"
|
|
|
|
#include "knumber_error.h"
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
|
|
namespace detail {
|
|
|
|
|
|
|
|
bool knumber_fraction::default_fractional_input = false;
|
|
|
|
bool knumber_fraction::default_fractional_output = true;
|
|
|
|
bool knumber_fraction::split_off_integer_for_fraction_output = false;
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void knumber_fraction::set_default_fractional_input(bool value) {
|
2021-11-29 22:05:38 +02:00
|
|
|
default_fractional_input = value;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void knumber_fraction::set_default_fractional_output(bool value) {
|
2021-11-29 22:05:38 +02:00
|
|
|
default_fractional_output = value;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
void knumber_fraction::set_split_off_integer_for_fraction_output(bool value) {
|
2021-11-29 22:05:38 +02:00
|
|
|
split_off_integer_for_fraction_output = value;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::knumber_fraction(const QString &s) {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_init(mpq_);
|
|
|
|
mpq_set_str(mpq_, s.toAscii(), 10);
|
|
|
|
mpq_canonicalize(mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::knumber_fraction(qint64 num, quint64 den) {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_init(mpq_);
|
|
|
|
mpq_set_si(mpq_, num, den);
|
|
|
|
mpq_canonicalize(mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::knumber_fraction(quint64 num, quint64 den) {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_init(mpq_);
|
|
|
|
mpq_set_ui(mpq_, num, den);
|
|
|
|
mpq_canonicalize(mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::knumber_fraction(mpq_t mpq) {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_init(mpq_);
|
|
|
|
mpq_set(mpq_, mpq);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::knumber_fraction(const knumber_fraction *value) {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_init(mpq_);
|
|
|
|
mpq_set(mpq_, value->mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::knumber_fraction(const knumber_integer *value) {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_init(mpq_);
|
|
|
|
mpq_set_z(mpq_, value->mpz_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::knumber_fraction(const knumber_float *value) {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_init(mpq_);
|
|
|
|
mpq_set_f(mpq_, value->mpf_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::clone() {
|
2021-11-29 22:05:38 +02:00
|
|
|
return new knumber_fraction(this);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_fraction::~knumber_fraction() {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_clear(mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
bool knumber_fraction::is_integer() const {
|
2021-11-29 22:05:38 +02:00
|
|
|
return (mpz_cmp_ui(mpq_denref(mpq_), 1) == 0);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::add(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
|
|
|
|
knumber_fraction q(p);
|
|
|
|
mpq_add(mpq_, mpq_, q.mpq_);
|
|
|
|
return this;
|
|
|
|
} else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->add(p);
|
|
|
|
} else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
|
|
|
|
mpq_add(mpq_, mpq_, p->mpq_);
|
|
|
|
return this;
|
|
|
|
} else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
|
|
|
|
knumber_error *e = new knumber_error(p);
|
|
|
|
delete this;
|
|
|
|
return e;
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_ASSERT(0);
|
|
|
|
return 0;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::sub(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
|
|
|
|
knumber_fraction q(p);
|
|
|
|
mpq_sub(mpq_, mpq_, q.mpq_);
|
|
|
|
return this;
|
|
|
|
} else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->sub(p);
|
|
|
|
} else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
|
|
|
|
mpq_sub(mpq_, mpq_, p->mpq_);
|
|
|
|
return this;
|
|
|
|
} else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
|
|
|
|
knumber_error *e = new knumber_error(p);
|
|
|
|
delete this;
|
|
|
|
return e->neg();
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_ASSERT(0);
|
|
|
|
return 0;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::mul(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
|
|
|
|
knumber_fraction q(p);
|
|
|
|
mpq_mul(mpq_, mpq_, q.mpq_);
|
|
|
|
return this;
|
|
|
|
} else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
|
|
|
|
knumber_float *q = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return q->mul(p);
|
|
|
|
} else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
|
|
|
|
mpq_mul(mpq_, mpq_, p->mpq_);
|
|
|
|
return this;
|
|
|
|
} else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
|
|
|
|
if(is_zero()) {
|
|
|
|
delete this;
|
|
|
|
knumber_error *e = new knumber_error(knumber_error::ERROR_UNDEFINED);
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(sign() < 0) {
|
|
|
|
delete this;
|
|
|
|
knumber_error *e = new knumber_error(p);
|
|
|
|
return e->neg();
|
|
|
|
} else {
|
|
|
|
delete this;
|
|
|
|
knumber_error *e = new knumber_error(p);
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Q_ASSERT(0);
|
|
|
|
return 0;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::div(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(rhs->is_zero()) {
|
|
|
|
if(sign() < 0) {
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_NEG_INFINITY);
|
|
|
|
} else {
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_POS_INFINITY);
|
|
|
|
}
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
|
|
|
|
knumber_fraction f(p);
|
|
|
|
return div(&f);
|
|
|
|
} else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->div(p);
|
|
|
|
} else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
|
|
|
|
mpq_div(mpq_, mpq_, p->mpq_);
|
|
|
|
return this;
|
|
|
|
} else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(p->sign() > 0) {
|
|
|
|
delete this;
|
|
|
|
return new knumber_integer(0);
|
|
|
|
} else if(p->sign() < 0) {
|
|
|
|
delete this;
|
|
|
|
return new knumber_integer(0);
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_error *e = new knumber_error(p);
|
|
|
|
delete this;
|
|
|
|
return e;
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_ASSERT(0);
|
|
|
|
return 0;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::mod(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(rhs->is_zero()) {
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
// NOTE: we don't support modulus operations with non-integer operands
|
|
|
|
mpq_set_d(mpq_, 0);
|
|
|
|
return this;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::bitwise_and(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_UNUSED(rhs);
|
|
|
|
delete this;
|
|
|
|
// NOTE: we don't support bitwise operations with non-integer operands
|
|
|
|
return new knumber_integer(0);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::bitwise_xor(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_UNUSED(rhs);
|
|
|
|
delete this;
|
|
|
|
// NOTE: we don't support bitwise operations with non-integer operands
|
|
|
|
return new knumber_integer(0);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::bitwise_or(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_UNUSED(rhs);
|
|
|
|
delete this;
|
|
|
|
// NOTE: we don't support bitwise operations with non-integer operands
|
|
|
|
return new knumber_integer(0);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::bitwise_shift(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_UNUSED(rhs);
|
|
|
|
delete this;
|
|
|
|
// NOTE: we don't support bitwise operations with non-integer operands
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::neg() {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_neg(mpq_, mpq_);
|
|
|
|
return this;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::abs() {
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_abs(mpq_, mpq_);
|
|
|
|
return this;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::cmp() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::sqrt() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(sign() < 0) {
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(mpz_perfect_square_p(mpq_numref(mpq_)) && mpz_perfect_square_p(mpq_denref(mpq_))) {
|
|
|
|
mpz_t num;
|
|
|
|
mpz_t den;
|
|
|
|
mpz_init(num);
|
|
|
|
mpz_init(den);
|
|
|
|
mpq_get_num(num, mpq_);
|
|
|
|
mpq_get_den(den, mpq_);
|
|
|
|
mpz_sqrt(num, num);
|
|
|
|
mpz_sqrt(den, den);
|
|
|
|
mpq_set_num(mpq_, num);
|
|
|
|
mpq_set_den(mpq_, den);
|
|
|
|
mpq_canonicalize(mpq_);
|
|
|
|
mpz_clear(num);
|
|
|
|
mpz_clear(den);
|
|
|
|
return this;
|
|
|
|
} else {
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->sqrt();
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::cbrt() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
// TODO: figure out how to properly use mpq_numref/mpq_denref here
|
|
|
|
mpz_t num;
|
|
|
|
mpz_t den;
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_init(num);
|
|
|
|
mpz_init(den);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_get_num(num, mpq_);
|
|
|
|
mpq_get_den(den, mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(mpz_root(num, num, 3) && mpz_root(den, den, 3)) {
|
|
|
|
mpq_set_num(mpq_, num);
|
|
|
|
mpq_set_den(mpq_, den);
|
|
|
|
mpq_canonicalize(mpq_);
|
|
|
|
mpz_clear(num);
|
|
|
|
mpz_clear(den);
|
|
|
|
return this;
|
|
|
|
} else {
|
|
|
|
mpz_clear(num);
|
|
|
|
mpz_clear(den);
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->cbrt();
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::factorial() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(sign() < 0) {
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_integer *i = new knumber_integer(this);
|
|
|
|
delete this;
|
|
|
|
return i->factorial();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::pow(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
// TODO: figure out how to properly use mpq_numref/mpq_denref here
|
|
|
|
if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
|
|
|
|
|
|
|
|
mpz_t num;
|
|
|
|
mpz_t den;
|
|
|
|
|
|
|
|
mpz_init(num);
|
|
|
|
mpz_init(den);
|
|
|
|
|
|
|
|
mpq_get_num(num, mpq_);
|
|
|
|
mpq_get_den(den, mpq_);
|
|
|
|
|
|
|
|
mpz_pow_ui(num, num, mpz_get_ui(p->mpz_));
|
|
|
|
mpz_pow_ui(den, den, mpz_get_ui(p->mpz_));
|
|
|
|
mpq_set_num(mpq_, num);
|
|
|
|
mpq_set_den(mpq_, den);
|
|
|
|
mpq_canonicalize(mpq_);
|
|
|
|
mpz_clear(num);
|
|
|
|
mpz_clear(den);
|
|
|
|
|
|
|
|
if(p->sign() < 0) {
|
|
|
|
return reciprocal();
|
|
|
|
} else {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
|
|
|
|
Q_UNUSED(p);
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->pow(rhs);
|
|
|
|
} else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
|
|
|
|
|
|
|
|
// ok, so if any part of the number is > 1,000,000, then we risk
|
|
|
|
// the pow function overflowing... so we'll just convert to float to be safe
|
|
|
|
// TODO: at some point, we should figure out exactly what the threashold is
|
|
|
|
// and if there is a better way to determine if the pow function will
|
|
|
|
// overflow.
|
|
|
|
if(mpz_cmpabs_ui(mpq_numref(mpq_), 1000000) > 0 || mpz_cmpabs_ui(mpq_denref(mpq_), 1000000) > 0 || mpz_cmpabs_ui(mpq_numref(p->mpq_), 1000000) > 0 || mpz_cmpabs_ui(mpq_denref(p->mpq_), 1000000) > 0) {
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->pow(rhs);
|
|
|
|
}
|
|
|
|
|
|
|
|
mpz_t lhs_num;
|
|
|
|
mpz_t lhs_den;
|
|
|
|
mpz_t rhs_num;
|
|
|
|
mpz_t rhs_den;
|
|
|
|
|
|
|
|
mpz_init(lhs_num);
|
|
|
|
mpz_init(lhs_den);
|
|
|
|
mpz_init(rhs_num);
|
|
|
|
mpz_init(rhs_den);
|
|
|
|
|
|
|
|
mpq_get_num(lhs_num, mpq_);
|
|
|
|
mpq_get_den(lhs_den, mpq_);
|
|
|
|
mpq_get_num(rhs_num, p->mpq_);
|
|
|
|
mpq_get_den(rhs_den, p->mpq_);
|
|
|
|
|
|
|
|
mpz_pow_ui(lhs_num, lhs_num, mpz_get_ui(rhs_num));
|
|
|
|
mpz_pow_ui(lhs_den, lhs_den, mpz_get_ui(rhs_num));
|
|
|
|
|
|
|
|
if(mpz_sgn(lhs_num) < 0 && mpz_even_p(rhs_den)) {
|
|
|
|
mpz_clear(lhs_num);
|
|
|
|
mpz_clear(lhs_den);
|
|
|
|
mpz_clear(rhs_num);
|
|
|
|
mpz_clear(rhs_den);
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(mpz_sgn(lhs_den) < 0 && mpz_even_p(rhs_den)) {
|
|
|
|
mpz_clear(lhs_num);
|
|
|
|
mpz_clear(lhs_den);
|
|
|
|
mpz_clear(rhs_num);
|
|
|
|
mpz_clear(rhs_den);
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
|
|
|
}
|
|
|
|
|
|
|
|
const int n1 = mpz_root(lhs_num, lhs_num, mpz_get_ui(rhs_den));
|
|
|
|
const int n2 = mpz_root(lhs_den, lhs_den, mpz_get_ui(rhs_den));
|
|
|
|
|
|
|
|
if(n1 && n2) {
|
|
|
|
|
|
|
|
mpq_set_num(mpq_, lhs_num);
|
|
|
|
mpq_set_den(mpq_, lhs_den);
|
|
|
|
mpq_canonicalize(mpq_);
|
|
|
|
mpz_clear(lhs_num);
|
|
|
|
mpz_clear(lhs_den);
|
|
|
|
mpz_clear(rhs_num);
|
|
|
|
mpz_clear(rhs_den);
|
|
|
|
|
|
|
|
if(p->sign() < 0) {
|
|
|
|
return reciprocal();
|
|
|
|
} else {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
mpz_clear(lhs_num);
|
|
|
|
mpz_clear(lhs_den);
|
|
|
|
mpz_clear(rhs_num);
|
|
|
|
mpz_clear(rhs_den);
|
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
|
|
|
|
return f->pow(rhs);
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
|
|
|
|
if(p->sign() > 0) {
|
|
|
|
knumber_error *e = new knumber_error(knumber_error::ERROR_POS_INFINITY);
|
|
|
|
delete this;
|
|
|
|
return e;
|
|
|
|
} else if(p->sign() < 0) {
|
|
|
|
knumber_integer *n = new knumber_integer(0);
|
|
|
|
delete this;
|
|
|
|
return n;
|
|
|
|
} else {
|
|
|
|
knumber_error *e = new knumber_error(knumber_error::ERROR_UNDEFINED);
|
|
|
|
delete this;
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Q_ASSERT(0);
|
|
|
|
return 0;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::sin() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->sin();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::floor() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->floor();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::ceil() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->ceil();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::cos() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->cos();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::tgamma() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->tgamma();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::tan() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->tan();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::asin() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->asin();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::acos() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->acos();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::atan() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->atan();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::sinh() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->sinh();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::cosh() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->cosh();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::tanh() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->tanh();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::asinh() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->asinh();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::acosh() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->acosh();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::atanh() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->atanh();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
int knumber_fraction::compare(knumber_base *rhs) {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
|
|
|
|
knumber_fraction f(p);
|
|
|
|
return mpq_cmp(mpq_, f.mpq_);
|
|
|
|
} else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
|
|
|
|
knumber_float f(this);
|
|
|
|
return f.compare(p);
|
|
|
|
} else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
|
|
|
|
return mpq_cmp(mpq_, p->mpq_);
|
|
|
|
} else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
|
|
|
|
// NOTE: any number compared to NaN/Inf/-Inf always compares less
|
|
|
|
// at the moment
|
|
|
|
return -1;
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_ASSERT(0);
|
|
|
|
return 0;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
QString knumber_fraction::toString(int precision) const {
|
|
|
|
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(knumber_fraction::default_fractional_output) {
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
// TODO: figure out how to properly use mpq_numref/mpq_denref here
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_integer integer_part(this);
|
|
|
|
if(split_off_integer_for_fraction_output && !integer_part.is_zero()) {
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_t num;
|
|
|
|
mpz_init(num);
|
|
|
|
mpq_get_num(num, mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_integer integer_part_1(this);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_mul(integer_part.mpz_, integer_part.mpz_, mpq_denref(mpq_));
|
|
|
|
mpz_sub(num, num, integer_part.mpz_);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
if(mpz_sgn(num) < 0) {
|
|
|
|
mpz_neg(num, num);
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
const size_t size = gmp_snprintf(NULL, 0, "%Zd %Zd/%Zd", integer_part_1.mpz_, num, mpq_denref(mpq_)) + 1;
|
2021-11-29 22:20:46 +02:00
|
|
|
KNUMBER_BUFFER(buf, size);
|
2021-11-29 22:05:38 +02:00
|
|
|
gmp_snprintf(&buf[0], size, "%Zd %Zd/%Zd", integer_part_1.mpz_, num, mpq_denref(mpq_));
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_clear(num);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
return QLatin1String(&buf[0]);
|
|
|
|
} else {
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_t num;
|
|
|
|
mpz_init(num);
|
|
|
|
mpq_get_num(num, mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
const size_t size = gmp_snprintf(NULL, 0, "%Zd/%Zd", num, mpq_denref(mpq_)) + 1;
|
2021-11-29 22:20:46 +02:00
|
|
|
KNUMBER_BUFFER(buf, size);
|
2021-11-29 22:05:38 +02:00
|
|
|
gmp_snprintf(&buf[0], size, "%Zd/%Zd", num, mpq_denref(mpq_));
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_clear(num);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
return QLatin1String(&buf[0]);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return knumber_float(this).toString(precision);
|
|
|
|
}
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
bool knumber_fraction::is_zero() const {
|
2021-11-29 22:05:38 +02:00
|
|
|
return mpq_sgn(mpq_) == 0;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
int knumber_fraction::sign() const {
|
2021-11-29 22:05:38 +02:00
|
|
|
return mpq_sgn(mpq_);
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::reciprocal() {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpq_inv(mpq_, mpq_);
|
|
|
|
return this;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_integer *knumber_fraction::numerator() const {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_t num;
|
|
|
|
mpz_init(num);
|
|
|
|
mpq_get_num(num, mpq_);
|
|
|
|
knumber_integer *n = new knumber_integer(num);
|
|
|
|
mpz_clear(num);
|
|
|
|
return n;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_integer *knumber_fraction::denominator() const {
|
|
|
|
|
2021-11-29 22:05:38 +02:00
|
|
|
mpz_t den;
|
|
|
|
mpz_init(den);
|
|
|
|
mpq_get_den(den, mpq_);
|
|
|
|
knumber_integer *n = new knumber_integer(den);
|
|
|
|
mpz_clear(den);
|
|
|
|
return n;
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::log2() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->log2();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::log10() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->log10();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::ln() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->ln();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::exp2() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->exp2();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::exp10() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->exp10();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::exp() {
|
2021-11-29 22:05:38 +02:00
|
|
|
knumber_float *f = new knumber_float(this);
|
|
|
|
delete this;
|
|
|
|
return f->exp();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
quint64 knumber_fraction::toUint64() const {
|
2021-11-29 22:05:38 +02:00
|
|
|
return knumber_integer(this).toUint64();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
qint64 knumber_fraction::toInt64() const {
|
2021-11-29 22:05:38 +02:00
|
|
|
return knumber_integer(this).toInt64();
|
2014-11-19 02:23:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Name:
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
knumber_base *knumber_fraction::bin(knumber_base *rhs) {
|
2021-11-29 22:05:38 +02:00
|
|
|
Q_UNUSED(rhs);
|
|
|
|
delete this;
|
|
|
|
return new knumber_error(knumber_error::ERROR_UNDEFINED);
|
2014-11-19 02:23:05 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|