diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-11-16 10:04:07 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2001-11-16 10:04:07 +0000 |
commit | d7c5add62414518abcc3aba8bcfd4f2576f553ff (patch) | |
tree | 88c350c64bfeddaa7b12aff653b9af7e9f2fa938 /add_ulp.c | |
parent | e541a0e318b9cd4508b5ff3c4e408108ae10a9af (diff) | |
download | mpfr-d7c5add62414518abcc3aba8bcfd4f2576f553ff.tar.gz |
1 -> BITS_PER_MP_LIMB
1 << (BITS_PER_MP_LIMB - 1) -> MP_LIMB_T_HIGHBIT
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1501 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'add_ulp.c')
-rw-r--r-- | add_ulp.c | 45 |
1 files changed, 23 insertions, 22 deletions
@@ -26,23 +26,21 @@ MA 02111-1307, USA. */ /* sets x to x+sign(x)*2^(MPFR_EXP(x)-MPFR_PREC(x)) */ void -#if __STDC__ -mpfr_add_one_ulp(mpfr_ptr x) -#else -mpfr_add_one_ulp(x) - mpfr_ptr x; -#endif +mpfr_add_one_ulp (mpfr_ptr x) { - int xn, sh; mp_limb_t *xp; + int xn, sh; + mp_limb_t *xp; - if (MPFR_IS_INF(x)) { return; } - xn = 1 + (MPFR_PREC(x)-1)/BITS_PER_MP_LIMB; - sh = xn*BITS_PER_MP_LIMB - MPFR_PREC(x); + if (MPFR_IS_INF(x)) + return; + + xn = 1 + (MPFR_PREC(x) - 1) / BITS_PER_MP_LIMB; + sh = xn * BITS_PER_MP_LIMB - MPFR_PREC(x); xp = MPFR_MANT(x); - if (mpn_add_1(xp, xp, xn, (mp_limb_t)1<<sh)) { - MPFR_EXP(x)++; - mpn_rshift(xp, xp, xn, 1); - xp[xn-1] += (mp_limb_t)1<<(BITS_PER_MP_LIMB-1); + if (mpn_add_1 (xp, xp, xn, MP_LIMB_T_ONE << sh)) /* got 1.0000... */ + { + MPFR_EXP(x)++; + xp[xn-1] = MP_LIMB_T_HIGHBIT; } return; } @@ -51,18 +49,21 @@ mpfr_add_one_ulp(x) void mpfr_sub_one_ulp(mpfr_ptr x) { - int xn, sh; mp_limb_t *xp; + int xn, sh; + mp_limb_t *xp; + + if (MPFR_IS_INF(x)) + return; - if (MPFR_IS_INF(x)) { return; } - xn = 1 + (MPFR_PREC(x)-1)/BITS_PER_MP_LIMB; - sh = xn*BITS_PER_MP_LIMB-MPFR_PREC(x); + xn = 1 + (MPFR_PREC(x) - 1) / BITS_PER_MP_LIMB; + sh = xn * BITS_PER_MP_LIMB - MPFR_PREC(x); xp = MPFR_MANT(x); - mpn_sub_1(xp, xp, xn, (mp_limb_t)1<<sh); - if (xp[xn-1] >> (BITS_PER_MP_LIMB-1) == 0) { + mpn_sub_1 (xp, xp, xn, MP_LIMB_T_ONE << sh); + if (xp[xn-1] >> (BITS_PER_MP_LIMB - 1) == 0) { /* was an exact power of two: not normalized any more */ MPFR_EXP(x)--; - mpn_lshift(xp, xp, xn, 1); - *xp |= ((mp_limb_t)1 << sh); + mpn_lshift (xp, xp, xn, 1); + *xp |= MP_LIMB_T_ONE << sh; } return; } |