[Bug 237800] pow(3) returns inaccurate results
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Wed May 8 20:24:35 UTC 2019
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=237800
--- Comment #5 from sgk at troutmask.apl.washington.edu ---
(In reply to Peter Jeremy from comment #3)
Peter, special casing small positive y values is still
fraught with floating rounding errors. Expanding on the
toy program a bit.
#include <stdio.h>
#include <math.h>
int
main()
{
int n;
double x, x2, x3, a, b;
printf("%a\n", 1.e29); /* check printf */
printf("%a\n", pow(10, 29)); /* gcc constant-folds */
x = 10;
printf("%a\n", pow(x, 29)); /* need library call */
x3 = x * x * x; /* x**3 */
a = x3 * x3 * x; /* x**7 */
a *= a; /* x**14 */
b = x * a * a; /* x**29 */
printf("%a\n", b);
x2 = x * x; /* x**2 */
a = x2 * x2; /* x**4 */
b = a * a; /* x**8 */
b = x * b * b * b * a;
printf("%a\n", b);
x = frexp(x, &n);
x2 = x * x; /* x**2 */
a = x2 * x2; /* x**4 */
a *= a; /* x**8 */
b = x * a * a * a * (x2 * x2);
b = ldexp(b, n*29);
printf("%a\n", b);
}
With clang,
cc -o z a.c -lm && ./z
0x1.431e0fae6d721p+96
0x1.431e0fae6d722p+96
0x1.431e0fae6d722p+96
0x1.431e0fae6d721p+96
0x1.431e0fae6d722p+96
0x1.431e0fae6d722p+96
With top-of-tree GCC,
~/work/x/bin/gcc -o z a.c -lm && ./z
0x1.431e0fae6d721p+96
0x1.431e0fae6d721p+96 <-- constant-folding with mpfr
0x1.431e0fae6d722p+96
0x1.431e0fae6d721p+96
0x1.431e0fae6d722p+96
0x1.431e0fae6d722p+96
~/work/x/bin/gcc -o z a.c -fno-builtin -lm && ./z
0x1.431e0fae6d721p+96
0x1.431e0fae6d722p+96 <-- libm pow() called
0x1.431e0fae6d722p+96
0x1.431e0fae6d721p+96
0x1.431e0fae6d722p+96
0x1.431e0fae6d722p+96
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-numerics
mailing list