[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdeutils/kcalc
From: Evan Teran <eteran () alum ! rit ! edu>
Date: 2010-12-10 2:47:23
Message-ID: 20101210024723.69A28AC8A6 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1205026 by teran:
changed the way that the power operator works when dealing with fraction knumber types
this should fixed bug #259363
BUG #259363
M +3 -7 kcalc.cpp
M +29 -50 knumber/knumber_priv.cpp
M +5 -0 knumber/knumber_priv.h
--- trunk/KDE/kdeutils/kcalc/kcalc.cpp #1205025:1205026
@@ -741,8 +741,7 @@
// left pad
foreach(QObject *obj, leftPad->children()) {
- KCalcButton *const button = qobject_cast<KCalcButton*>(obj);
- if (button) {
+ if (KCalcButton *const button = qobject_cast<KCalcButton*>(obj)) {
button->setFixedWidth(em.width()*4 + margin*2);
button->installEventFilter(this);
}
@@ -751,8 +750,7 @@
// right pad
foreach(QObject *obj, rightPad->children()) {
- KCalcButton *const button = qobject_cast<KCalcButton*>(obj);
- if (button) {
+ if (KCalcButton *const button = qobject_cast<KCalcButton*>(obj)) {
button->setFixedWidth(em.width()*3 + margin*2);
button->installEventFilter(this);
}
@@ -761,8 +759,7 @@
// numeric pad
foreach(QObject *obj, numericPad->children()) {
- KCalcButton *const button = qobject_cast<KCalcButton*>(obj);
- if (button) {
+ if (KCalcButton *const button = qobject_cast<KCalcButton*>(obj)) {
if (button != pb0) { // let pb0 expand freely
button->setFixedWidth(em.width()*3 + margin*2);
}
@@ -774,7 +771,6 @@
void KCalculator::slotConstantToDisplay(const science_constant &const_chosen)
{
calc_display->setAmount(const_chosen.value);
-
updateDisplay(0);
}
--- trunk/KDE/kdeutils/kcalc/knumber/knumber_priv.cpp #1205025:1205026
@@ -832,12 +832,11 @@
return new knumerror(UndefinedNumber);
}
-detail::knumber *detail::knuminteger::power(const knumber &exponent) const
-{
- if (exponent.type() == IntegerType) {
+detail::knumber *detail::knuminteger::power_integer(const knumber &exponent) const {
mpz_t tmp_mpz;
- mpz_init_set(tmp_mpz,
+ mpz_init_set(
+ tmp_mpz,
dynamic_cast<const knuminteger &>(exponent).mpz_);
if (!mpz_fits_ulong_p(tmp_mpz)) {
@@ -845,12 +844,10 @@
mpz_clear(tmp_mpz);
// need to cast everything to float
- const knumfloat tmp_num1(*this);
- const knumfloat tmp_num2(exponent);
- return tmp_num1.power(tmp_num2);
+ return knumfloat(*this).power(knumfloat(exponent));
}
- const unsigned long int tmp_int = mpz_get_ui(tmp_mpz);
+ const unsigned long tmp_int = mpz_get_ui(tmp_mpz);
mpz_clear(tmp_mpz);
knuminteger *const tmp_num = new knuminteger();
@@ -858,7 +855,7 @@
return tmp_num;
}
- if (exponent.type() == FractionType) {
+detail::knumber *detail::knuminteger::power_fraction(const knumber &exponent) const {
if (mpz_sgn(mpz_) < 0) {
return new knumerror(UndefinedNumber);
}
@@ -866,7 +863,8 @@
// GMP only supports few root functions, so we need to convert
// into signed long int
mpz_t tmp_mpz;
- mpz_init_set(tmp_mpz,
+ mpz_init_set(
+ tmp_mpz,
mpq_denref(dynamic_cast<const knumfraction &>(exponent).mpq_));
if (!mpz_fits_ulong_p(tmp_mpz)) {
@@ -874,30 +872,26 @@
mpz_clear(tmp_mpz);
// need to cast everything to float
- const knumfloat tmp_num1(*this);
- const knumfloat tmp_num2(exponent);
- return tmp_num1.power(tmp_num2);
+ return knumfloat(*this).power(knumfloat(exponent));
}
- unsigned long int tmp_int = mpz_get_ui(tmp_mpz);
+ unsigned long tmp_int = mpz_get_ui(tmp_mpz);
mpz_clear(tmp_mpz);
// first check if result will be an integer
knuminteger *const tmp_num = new knuminteger();
- const int flag = mpz_root(tmp_num->mpz_, mpz_, tmp_int);
- if (flag == 0) { // result is not exact
+ if (mpz_root(tmp_num->mpz_, mpz_, tmp_int) == 0) { // result is not exact
delete tmp_num;
// need to cast everything to float
- const knumfloat tmp_num1(*this);
- const knumfloat tmp_num2(exponent);
- return tmp_num1.power(tmp_num2);
+ return knumfloat(*this).power(knumfloat(exponent));
}
// result is exact
- mpz_init_set(tmp_mpz,
+ mpz_init_set(
+ tmp_mpz,
mpq_numref(dynamic_cast<const knumfraction &>(exponent).mpq_));
if (!mpz_fits_ulong_p(tmp_mpz)) { // conversion wouldn't work, so
@@ -905,9 +899,7 @@
mpz_clear(tmp_mpz);
// need to cast everything to float
- const knumfloat tmp_num1(*this);
- const knumfloat tmp_num2(exponent);
- return tmp_num1.power(tmp_num2);
+ return knumfloat(*this).power(knumfloat(exponent));
}
tmp_int = mpz_get_ui(tmp_mpz);
@@ -918,44 +910,31 @@
return tmp_num;
}
- if (exponent.type() == FloatType) {
- // need to cast everything to float
- const knumfloat tmp_num(*this);
- return tmp_num.power(exponent);
+detail::knumber *detail::knuminteger::power_float(const knumber &exponent) const {
+ return knumfloat(*this).power(exponent);
}
- return new knumerror(Infinity);
+detail::knumber *detail::knuminteger::power(const knumber &exponent) const
+{
+ switch(exponent.type()) {
+ case IntegerType: return power_integer(exponent);
+ case FractionType: return power_fraction(exponent);
+ case FloatType: return power_float(exponent);
+ default: return new knumerror(Infinity);
}
+}
detail::knumber *detail::knumfraction::power(const knumber &exponent) const
{
- knuminteger tmp_num;
-
- mpz_set(tmp_num.mpz_, mpq_numref(mpq_));
- knumber *const numer = tmp_num.power(exponent);
-
- mpz_set(tmp_num.mpz_, mpq_denref(mpq_));
- knumber *const denom = tmp_num.power(exponent);
-
- knumber *result;
-
- if (numer->type() == SpecialType) {
- result = new knumerror(*numer);
- } else if (denom->type() == SpecialType) {
- result = new knumerror(*denom);
- } else {
- result = numer->divide(*denom);
+ return knumfloat(*this).power(exponent);
}
- delete numer;
- delete denom;
- return result;
-}
-
detail::knumber *detail::knumfloat::power(const knumber &exponent) const
{
- const double result = pow(static_cast<double>(*this),
+ const double result = pow(
+ static_cast<double>(*this),
static_cast<double>(exponent));
+
if (isnan(result)) {
return new knumerror(UndefinedNumber);
}
--- trunk/KDE/kdeutils/kcalc/knumber/knumber_priv.h #1205025:1205026
@@ -185,6 +185,11 @@
knumber *shift(const knuminteger &arg2) const;
private:
+ knumber *power_integer(const knumber &exponent) const;
+ knumber *power_fraction (const knumber &exponent) const;
+ knumber *power_float(const knumber &exponent) const;
+
+private:
mpz_t mpz_;
friend class knumfraction;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic