Date: Sat, 24 Aug 1996 15:43:57 +1000 From: Bruce Evans <bde@zeta.org.au> To: freebsd-hackers@FreeBSD.org, voisine@cioe.com Subject: Re: rintf broke? Message-ID: <199608240543.PAA16214@godzilla.zeta.org.au>
next in thread | raw e-mail | index | archive | help
>Umm... is the rintf function broken or what?
>...
> cout << rintf(12.3456789) << endl;
>...
>here's the output:
>12.125
Yes, it is broken. printf("%g", rintf(12.3456789) also gives 12.125.
I wouldn't use the float-precision functions. hypotf() and powf() are
also broken. acosf(), asinf() and atan2f() have small errors and are
slower than the corresponding double-precision functions if the hardware
versions are used.
Here are some fixes. They have been tested a lot using `ucbtest' but
haven't been used much. `ucbtest' apparently doesn't test rintf().
Bruce
diff -c2 src/lib/msun/src/e_acosf.c~ src/lib/msun/src/e_acosf.c
*** src/lib/msun/src/e_acosf.c~ Wed May 31 19:12:47 1995
--- src/lib/msun/src/e_acosf.c Wed May 31 19:15:41 1995
***************
*** 27,33 ****
#endif
one = 1.0000000000e+00, /* 0x3F800000 */
! pi = 3.1415925026e+00, /* 0x40490fda */
! pio2_hi = 1.5707962513e+00, /* 0x3fc90fda */
! pio2_lo = 7.5497894159e-08, /* 0x33a22168 */
pS0 = 1.6666667163e-01, /* 0x3e2aaaab */
pS1 = -3.2556581497e-01, /* 0xbea6b090 */
--- 27,33 ----
#endif
one = 1.0000000000e+00, /* 0x3F800000 */
! pi = 3.1415927410e+00, /* 0x40490fdb */
! pio2_hi = 1.5707963705e+00, /* 0x3fc90fdb */
! pio2_lo = -4.3711388287e-08, /* 0xb33bbd2e */
pS0 = 1.6666667163e-01, /* 0x3e2aaaab */
pS1 = -3.2556581497e-01, /* 0xbea6b090 */
diff -c2 src/lib/msun/src/e_asinf.c~ src/lib/msun/src/e_asinf.c
*** src/lib/msun/src/e_asinf.c~ Sat Jul 13 18:31:41 1996
--- src/lib/msun/src/e_asinf.c Sat Jul 13 18:31:41 1996
***************
*** 28,34 ****
one = 1.0000000000e+00, /* 0x3F800000 */
huge = 1.000e+30,
! pio2_hi = 1.5707962513e+00, /* 0x3fc90fda */
! pio2_lo = 7.5497894159e-08, /* 0x33a22168 */
pio4_hi = 7.8539818525e-01, /* 0x3f490fdb */
/* coefficient for R(x^2) */
pS0 = 1.6666667163e-01, /* 0x3e2aaaab */
--- 28,35 ----
one = 1.0000000000e+00, /* 0x3F800000 */
huge = 1.000e+30,
! pio2_hi = 1.5707963705e+00, /* 0x3fc90fdb */
! pio2_lo = -4.3711388287e-08, /* 0xb33bbd2e */
pio4_hi = 7.8539818525e-01, /* 0x3f490fdb */
+
/* coefficient for R(x^2) */
pS0 = 1.6666667163e-01, /* 0x3e2aaaab */
diff -c2 src/lib/msun/src/e_atan2f.c~ src/lib/msun/src/e_atan2f.c
*** src/lib/msun/src/e_atan2f.c~ Wed May 31 19:12:50 1995
--- src/lib/msun/src/e_atan2f.c Wed May 31 19:16:01 1995
***************
*** 30,35 ****
pi_o_4 = 7.8539818525e-01, /* 0x3f490fdb */
pi_o_2 = 1.5707963705e+00, /* 0x3fc90fdb */
! pi = 3.1415925026e+00, /* 0x40490fda */
! pi_lo = 1.5099578832e-07; /* 0x34222168 */
#ifdef __STDC__
--- 30,35 ----
pi_o_4 = 7.8539818525e-01, /* 0x3f490fdb */
pi_o_2 = 1.5707963705e+00, /* 0x3fc90fdb */
! pi = 3.1415927410e+00, /* 0x40490fdb */
! pi_lo = -8.7422776573e-08; /* 0xb3bbbd2e */
#ifdef __STDC__
diff -c2 src/lib/msun/src/e_hypotf.c~ src/lib/msun/src/e_hypotf.c
*** src/lib/msun/src/e_hypotf.c~ Wed May 31 19:12:56 1995
--- src/lib/msun/src/e_hypotf.c Wed May 31 19:16:16 1995
***************
*** 47,52 ****
return w;
}
! /* scale a and b by 2**-60 */
! ha -= 0x5d800000; hb -= 0x5d800000; k += 60;
SET_FLOAT_WORD(a,ha);
SET_FLOAT_WORD(b,hb);
--- 47,52 ----
return w;
}
! /* scale a and b by 2**-68 */
! ha -= 0x22000000; hb -= 0x22000000; k += 68;
SET_FLOAT_WORD(a,ha);
SET_FLOAT_WORD(b,hb);
***************
*** 55,66 ****
if(hb <= 0x007fffff) { /* subnormal b or 0 */
if(hb==0) return a;
! SET_FLOAT_WORD(t1,0x3f000000); /* t1=2^126 */
b *= t1;
a *= t1;
k -= 126;
! } else { /* scale a and b by 2^60 */
! ha += 0x5d800000; /* a *= 2^60 */
! hb += 0x5d800000; /* b *= 2^60 */
! k -= 60;
SET_FLOAT_WORD(a,ha);
SET_FLOAT_WORD(b,hb);
--- 55,66 ----
if(hb <= 0x007fffff) { /* subnormal b or 0 */
if(hb==0) return a;
! SET_FLOAT_WORD(t1,0x7e800000); /* t1=2^126 */
b *= t1;
a *= t1;
k -= 126;
! } else { /* scale a and b by 2^68 */
! ha += 0x22000000; /* a *= 2^68 */
! hb += 0x22000000; /* b *= 2^68 */
! k -= 68;
SET_FLOAT_WORD(a,ha);
SET_FLOAT_WORD(b,hb);
diff -c2 src/lib/msun/src/e_powf.c~ src/lib/msun/src/e_powf.c
*** src/lib/msun/src/e_powf.c~ Wed May 31 19:13:02 1995
--- src/lib/msun/src/e_powf.c Wed May 31 19:16:23 1995
***************
*** 49,53 ****
--- 49,57 ----
lg2 = 6.9314718246e-01, /* 0x3f317218 */
lg2_h = 6.93145752e-01, /* 0x3f317200 */
+ #if 0
+ lg2_l = 1.42860677e-06, /* 0x35bfbe8e */
+ #else
lg2_l = 1.42860654e-06, /* 0x35bfbe8c */
+ #endif
ovt = 4.2995665694e-08, /* -(128-log2(ovfl+.5ulp)) */
cp = 9.6179670095e-01, /* 0x3f76384f =2/(3ln2) */
***************
*** 168,174 ****
s_h = s;
GET_FLOAT_WORD(is,s_h);
! SET_FLOAT_WORD(s_h,is&0xfffff000);
/* t_h=ax+bp[k] High */
! SET_FLOAT_WORD(t_h,((ix>>1)|0x20000000)+0x0040000+(k<<21));
t_l = ax - (t_h-bp[k]);
s_l = v*((u-s_h*t_h)-s_h*t_l);
--- 172,178 ----
s_h = s;
GET_FLOAT_WORD(is,s_h);
! SET_FLOAT_WORD(s_h,is&0xfffc0000);
/* t_h=ax+bp[k] High */
! SET_FLOAT_WORD(t_h,((ix>>1)|0x20000000)+0x00400000+(k<<21));
t_l = ax - (t_h-bp[k]);
s_l = v*((u-s_h*t_h)-s_h*t_l);
***************
*** 237,241 ****
t = p_l+p_h;
GET_FLOAT_WORD(is,t);
! SET_FLOAT_WORD(t,is&0xfffff000);
u = t*lg2_h;
v = (p_l-(t-p_h))*lg2+t*lg2_l;
--- 241,245 ----
t = p_l+p_h;
GET_FLOAT_WORD(is,t);
! SET_FLOAT_WORD(t,is&0xfffffff8);
u = t*lg2_h;
v = (p_l-(t-p_h))*lg2+t*lg2_l;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199608240543.PAA16214>
