mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 22:40:05 +00:00
alpha: fix trunc for big input values
The alpha specific version of trunc and truncf always add and subtract 0x1.0p23 or 0x1.0p52 even for big values. This causes this kind of errors in the testsuite: Failure: Test: trunc_towardzero (0x1p107) Result: is: 1.6225927682921334e+32 0x1.fffffffffffffp+106 should be: 1.6225927682921336e+32 0x1.0000000000000p+107 difference: 1.8014398509481984e+16 0x1.0000000000000p+54 ulp : 0.5000 max.ulp : 0.0000 Change this by returning the input value when its absolute value is greater than 0x1.0p23 or 0x1.0p52. NaN have to go through the add and subtract operations to get possibly silenced. Finally remove the code to handle inexact exception, trunc should never generate such an exception. Changelog: * sysdeps/alpha/fpu/s_trunc.c (__trunc): Return the input value when its absolute value is greater than 0x1.0p52. [_IEEE_FP_INEXACT] Remove. * sysdeps/alpha/fpu/s_truncf.c (__truncf): Return the input value when its absolute value is greater than 0x1.0p23. [_IEEE_FP_INEXACT] Remove.
This commit is contained in:
parent
cb7f9d63b9
commit
b74d259fe7
@ -11,6 +11,12 @@
|
||||
* sysdeps/alpha/fpu/s_rint.c (__rint): Add argument with itself
|
||||
when it is a NaN.
|
||||
* sysdeps/alpha/fpu/s_rintf.c (__rintf): Likewise.
|
||||
* sysdeps/alpha/fpu/s_trunc.c (__trunc): Return the input value
|
||||
when its absolute value is greater than 0x1.0p52.
|
||||
[_IEEE_FP_INEXACT] Remove.
|
||||
* sysdeps/alpha/fpu/s_truncf.c (__truncf): Return the input value
|
||||
when its absolute value is greater than 0x1.0p23.
|
||||
[_IEEE_FP_INEXACT] Remove.
|
||||
|
||||
2016-08-01 Carlos O'Donell <carlos@redhat.com>
|
||||
|
||||
|
@ -28,12 +28,11 @@ __trunc (double x)
|
||||
double two52 = copysign (0x1.0p52, x);
|
||||
double r, tmp;
|
||||
|
||||
if (isgreaterequal (fabs (x), 0x1.0p52))
|
||||
return x;
|
||||
|
||||
__asm (
|
||||
#ifdef _IEEE_FP_INEXACT
|
||||
"addt/suic %2, %3, %1\n\tsubt/suic %1, %3, %0"
|
||||
#else
|
||||
"addt/suc %2, %3, %1\n\tsubt/suc %1, %3, %0"
|
||||
#endif
|
||||
: "=&f"(r), "=&f"(tmp)
|
||||
: "f"(x), "f"(two52));
|
||||
|
||||
|
@ -27,12 +27,11 @@ __truncf (float x)
|
||||
float two23 = copysignf (0x1.0p23, x);
|
||||
float r, tmp;
|
||||
|
||||
if (isgreaterequal (fabsf (x), 0x1.0p23))
|
||||
return x;
|
||||
|
||||
__asm (
|
||||
#ifdef _IEEE_FP_INEXACT
|
||||
"adds/suic %2, %3, %1\n\tsubs/suic %1, %3, %0"
|
||||
#else
|
||||
"adds/suc %2, %3, %1\n\tsubs/suc %1, %3, %0"
|
||||
#endif
|
||||
: "=&f"(r), "=&f"(tmp)
|
||||
: "f"(x), "f"(two23));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user