Index: src/kernel/none/mp.c
===================================================================
RCS file: /home/cvs/pari/src/kernel/none/mp.c,v
retrieving revision 1.33.2.3
diff -u -r1.33.2.3 mp.c
--- ./src/kernel/none/mp.c 29 Jan 2002 13:46:23 -0000 1.33.2.3
+++ ./src/kernel/none/mp.c 10 Oct 2005 09:45:44 -0000
@@ -2314,9 +2314,22 @@
if (x==0) { z[1]=evalexpo(-308); z[2]=0; return z; }
fi.f = x;
- e = evalexpo(((fi.i & (HIGHBIT-1)) >> mant_len) - exp_mid);
- z[1] = e | evalsigne(x<0? -1: 1);
- z[2] = (fi.i << expo_len) | HIGHBIT;
+ {
+ const ulong a = fi.i;
+ ulong A;
+ e = ((a & (HIGHBIT-1)) >> mant_len) - exp_mid;
+ if (e == exp_mid+1) err(talker, "NaN or Infinity in dbltor");
+ A = a << expo_len;
+ if (e == -exp_mid)
+ { /* unnormalized values */
+ int sh = bfffo(A);
+ e -= sh-1;
+ z[2] = A << sh;
+ }
+ else
+ z[2] = HIGHBIT | A;
+ z[1] = evalexpo(e) | evalsigne(x<0? -1: 1);
+ }
return z;
}
@@ -2370,10 +2383,35 @@
{
const ulong a = fi.i[INDEX0];
const ulong b = fi.i[INDEX1];
- e = evalexpo(((a & (HIGHBIT-1)) >> shift) - exp_mid);
- z[1] = e | evalsigne(x<0? -1: 1);
- z[3] = b << expo_len;
- z[2] = HIGHBIT | b >> (BITS_IN_LONG-expo_len) | (a << expo_len);
+ ulong A, B;
+ e = ((a & (HIGHBIT-1)) >> shift) - exp_mid;
+ if (e == exp_mid+1) err(talker, "NaN or Infinity in dbltor");
+ A = b >> (BITS_IN_LONG-expo_len) | (a << expo_len);
+ B = b << expo_len;
+ if (e == -exp_mid)
+ { /* unnormalized values */
+ int sh;
+ if (A)
+ {
+ sh = bfffo(A);
+ e -= sh-1;
+ z[2] = (A << sh) | (B >> (32-sh));
+ z[3] = B << sh;
+ }
+ else
+ {
+ sh = bfffo(B); /* B != 0 */
+ e -= sh-1 + 32;
+ z[2] = B << sh;
+ z[3] = 0;
+ }
+ }
+ else
+ {
+ z[3] = B;
+ z[2] = HIGHBIT | A;
+ }
+ z[1] = evalexpo(e) | evalsigne(x<0? -1: 1);
}
return z;
}