[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