summaryrefslogtreecommitdiff
path: root/ui_pow.c
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2003-09-09 10:39:01 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2003-09-09 10:39:01 +0000
commit188bad4470bb475be6aed54505ee24800f299ac1 (patch)
treeee20fb8336b78c9bfe3ca992a7bcd949f17a4225 /ui_pow.c
parente6de60e965acd2891b1a1c93e43d2db4061c8a41 (diff)
downloadmpfr-188bad4470bb475be6aed54505ee24800f299ac1.tar.gz
Code clean-up and reindented. Replaced a 8 by CHAR_BIT,
as CHAR_BIT isn't necessarily equal to 8. The bug seems to occur on all machines. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@2404 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'ui_pow.c')
-rw-r--r--ui_pow.c142
1 files changed, 72 insertions, 70 deletions
diff --git a/ui_pow.c b/ui_pow.c
index 2e45339d2..cfa4b21e1 100644
--- a/ui_pow.c
+++ b/ui_pow.c
@@ -19,6 +19,8 @@ along with the MPFR Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
+#include <limits.h>
+
#include "gmp.h"
#include "gmp-impl.h"
#include "longlong.h"
@@ -95,86 +97,86 @@ mpfr_ui_pow_is_exact (unsigned long int x, mpfr_srcptr y)
int
mpfr_ui_pow (mpfr_ptr y, unsigned long int n, mpfr_srcptr x, mp_rnd_t rnd_mode)
{
- int inexact = 1;
+ int inexact;
- if (MPFR_IS_NAN(x))
- {
- MPFR_SET_NAN(y);
- MPFR_RET_NAN;
- }
+ if (MPFR_IS_NAN(x))
+ {
+ MPFR_SET_NAN(y);
+ MPFR_RET_NAN;
+ }
- MPFR_CLEAR_NAN(y);
+ MPFR_CLEAR_NAN(y);
- if (MPFR_IS_INF(x))
- {
- if (MPFR_SIGN(x) < 0)
- {
- MPFR_CLEAR_INF(y);
- MPFR_SET_ZERO(y);
- }
- else
- {
- MPFR_SET_INF(y);
- }
- MPFR_SET_POS(y);
- MPFR_RET(0);
- }
+ if (MPFR_IS_INF(x))
+ {
+ if (MPFR_SIGN(x) < 0)
+ {
+ MPFR_CLEAR_INF(y);
+ MPFR_SET_ZERO(y);
+ }
+ else
+ {
+ MPFR_SET_INF(y);
+ }
+ MPFR_SET_POS(y);
+ MPFR_RET(0);
+ }
- /* n^0 = 1 */
- if (MPFR_IS_ZERO(x))
- return mpfr_set_ui (y, 1, rnd_mode);
+ /* n^0 = 1 */
+ if (MPFR_IS_ZERO(x))
+ return mpfr_set_ui (y, 1, rnd_mode);
- inexact = mpfr_ui_pow_is_exact (n, x) == 0;
+ inexact = mpfr_ui_pow_is_exact (n, x) == 0;
- /* General case */
- {
- /* Declaration of the intermediary variable */
- mpfr_t t, te, ti;
-
- /* Declaration of the size variable */
- mp_prec_t Nx = MPFR_PREC(x); /* Precision of input variable */
- mp_prec_t Ny = MPFR_PREC(y); /* Precision of input variable */
-
- mp_prec_t Nt; /* Precision of the intermediary variable */
- long int err; /* Precision of error */
-
- /* compute the precision of intermediary variable */
- Nt = MAX(Nx,Ny);
- /* the optimal number of bits : see algorithms.ps */
- Nt = Nt + 5 + __gmpfr_ceil_log2 (Nt);
-
- /* initialise of intermediary variable */
- mpfr_init2 (t, MPFR_PREC_MIN);
- mpfr_init2 (ti, sizeof(unsigned long int) * 8); /* 8 = CHAR_BIT */
- mpfr_init2 (te, MPFR_PREC_MIN);
-
- do
- {
- /* reactualisation of the precision */
- mpfr_set_prec (t, Nt);
- mpfr_set_prec (te, Nt);
+ /* General case */
+ {
+ /* Declaration of the intermediary variable */
+ mpfr_t t, te, ti;
- /* compute exp(x*ln(n))*/
- mpfr_set_ui (ti, n, GMP_RNDN); /* ti <- n*/
- mpfr_log (t, ti, GMP_RNDU); /* ln(n) */
- mpfr_mul (te, x, t, GMP_RNDU); /* x*ln(n) */
- mpfr_exp (t, te, GMP_RNDN); /* exp(x*ln(n))*/
+ /* Declaration of the size variable */
+ mp_prec_t Nx = MPFR_PREC(x); /* Precision of input variable */
+ mp_prec_t Ny = MPFR_PREC(y); /* Precision of input variable */
- /* error estimate -- see pow function in algorithms.ps */
- err = Nt - (MPFR_GET_EXP (te) + 3);
+ mp_prec_t Nt; /* Precision of the intermediary variable */
+ long int err; /* Precision of error */
- /* actualisation of the precision */
- Nt += 10;
- }
- while (inexact &&
- (err < 0 || !mpfr_can_round (t, err, GMP_RNDN, rnd_mode, Ny)));
+ /* compute the precision of intermediary variable */
+ Nt = MAX(Nx,Ny);
+ /* the optimal number of bits : see algorithms.ps */
+ Nt = Nt + 5 + __gmpfr_ceil_log2 (Nt);
- inexact = mpfr_set (y, t, rnd_mode);
+ /* initialise of intermediary variable */
+ mpfr_init2 (t, MPFR_PREC_MIN);
+ mpfr_init2 (ti, sizeof(unsigned long int) * CHAR_BIT);
+ mpfr_init2 (te, MPFR_PREC_MIN);
- mpfr_clear (t);
- mpfr_clear (ti);
- mpfr_clear (te);
- }
- return inexact;
+ do
+ {
+ /* reactualisation of the precision */
+ mpfr_set_prec (t, Nt);
+ mpfr_set_prec (te, Nt);
+
+ /* compute exp(x*ln(n)) */
+ mpfr_set_ui (ti, n, GMP_RNDN); /* ti <- n */
+ mpfr_log (t, ti, GMP_RNDU); /* ln(n) */
+ mpfr_mul (te, x, t, GMP_RNDU); /* x*ln(n) */
+ mpfr_exp (t, te, GMP_RNDN); /* exp(x*ln(n)) */
+
+ /* error estimate -- see pow function in algorithms.ps */
+ err = Nt - (MPFR_GET_EXP (te) + 3);
+
+ /* actualisation of the precision */
+ Nt += 10;
+ }
+ while (inexact &&
+ (err < 0 || !mpfr_can_round (t, err, GMP_RNDN, rnd_mode, Ny)));
+
+ inexact = mpfr_set (y, t, rnd_mode);
+
+ mpfr_clear (t);
+ mpfr_clear (ti);
+ mpfr_clear (te);
+ }
+ return inexact;
}