diff --git a/include/real.cpp b/include/real.cpp index 97a4b8d48..cdb68443f 100755 --- a/include/real.cpp +++ b/include/real.cpp @@ -149,6 +149,23 @@ char *real::string ( return __string; } +// Childish algorithm faster and more accurate than powl(10.0, pow) +HIDDEN long double ipow10(int pow) +{ + long double n = 1.0; + if (pow > 0) + { + for (int i = pow; i > 0; i--) + n *= 10.0; + } + else + { + for (int i = pow; i < 0; i++) + n *= 0.1; + } + return n; +} + // @mfunc real& | real | round | Arrotonda al numero di decimali passati real& real::round ( int prec) // @parm Numero di decimali a cui arrotondare il numero (default 0) @@ -161,8 +178,8 @@ real& real::round ( { long double p = 1.0; if (prec != 0) - { - p = powl (10.0, prec); + { + p = ipow10(prec); _dec *= p; } _dec = floorl(_dec + 0.5); @@ -177,7 +194,7 @@ real& real::ceil (int prec) long double p = 1.0; if (prec != 0) { - p = powl(10.0, prec); + p = ipow10(prec); _dec *= p; } _dec = ceill(_dec); @@ -192,7 +209,7 @@ real& real::trunc(int prec) long double p = 1.0; if (prec != 0) { - p = powl(10.0, prec); + p = ipow10(prec); _dec *= p; } _dec = floorl(_dec);