[Bug 277783] libc fma() doesn't not return the correct zero sign
- In reply to: bugzilla-noreply_a_freebsd.org: "[Bug 277783] libc fma() doesn't not return the correct zero sign"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 12 Jun 2024 18:58:03 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=277783 --- Comment #11 from Steve Kargl <kargl@FreeBSD.org> --- Someone smarter than me may need to look at this! With the original src/s_fma.c, I see dble (x,y,z): -0x1p+0 0x1p+0 0x1p+0 mpfr (x,y,z): -0x1p+0 0x1p+0 0x1p+0 mpfr libm RNDN: 0x0p+0 0x0p+0 RNDU: 0x0p+0 0x0p+0 RNDD: -0x0p+0 -0x0p+0 RNDZ: 0x0p+0 0x0p+0 dble (x,y,z): 0x1p+0 -0x1p+0 0x1p+0 mpfr (x,y,z): 0x1p+0 -0x1p+0 0x1p+0 mpfr libm RNDN: 0x0p+0 0x0p+0 RNDU: 0x0p+0 0x0p+0 RNDD: -0x0p+0 -0x0p+0 RNDZ: 0x0p+0 0x0p+0 dble (x,y,z): -0x1p+0 -0x1p+0 -0x1p+0 mpfr (x,y,z): -0x1p+0 -0x1p+0 -0x1p+0 mpfr libm RNDN: 0x0p+0 0x0p+0 RNDU: 0x0p+0 0x0p+0 RNDD: -0x0p+0 -0x0p+0 RNDZ: 0x0p+0 0x0p+0 dble (x,y,z): 0x1.ffffffffffff8p-501 0x1.0000000000004p-500 -0x1p-1000 mpfr (x,y,z): 0xf.fffffffffffcp-504 0x1.0000000000004p-500 -0x1p-1000 mpfr libm RNDN: -0x0p+0 0x0p+0 RNDU: -0x0p+0 0x0p+0 RNDD: -0x1p-1074 -0x1p-1074 RNDZ: -0x0p+0 0x0p+0 The first groups of three are fma(-1.,1.,1.), fma(1.,-1.,1.), and fma(-1.,-1.,-1.) with the four rounding modes. The group is Victor's example where the rounding is wrong. If one looks in src/s_fma.c, there is a special case for addends that sum to zero. This is the 'if (r.hi == 0.0) {}' block of code (lines 263-274). If I comment out this block, I get wrong results for fma(-1.,1.,1.), fma(1.,-1.,1.), and fma(-1.,-1.,-1.), but correct results for Victor's input. :( dble (x,y,z): -0x1p+0 0x1p+0 0x1p+0 mpfr (x,y,z): -0x1p+0 0x1p+0 0x1p+0 mpfr libm RNDN: 0x0p+0 0x0p+0 RNDU: 0x0p+0 0x0p+0 RNDD: -0x0p+0 0x0p+0 RNDZ: 0x0p+0 0x0p+0 dble (x,y,z): 0x1p+0 -0x1p+0 0x1p+0 mpfr (x,y,z): 0x1p+0 -0x1p+0 0x1p+0 mpfr libm RNDN: 0x0p+0 0x0p+0 RNDU: 0x0p+0 0x0p+0 RNDD: -0x0p+0 0x0p+0 RNDZ: 0x0p+0 0x0p+0 dble (x,y,z): -0x1p+0 -0x1p+0 -0x1p+0 mpfr (x,y,z): -0x1p+0 -0x1p+0 -0x1p+0 mpfr libm RNDN: 0x0p+0 0x0p+0 RNDU: 0x0p+0 0x0p+0 RNDD: -0x0p+0 0x0p+0 RNDZ: 0x0p+0 0x0p+0 dble (x,y,z): 0x1.ffffffffffff8p-501 0x1.0000000000004p-500 -0x1p-1000 mpfr (x,y,z): 0xf.fffffffffffcp-504 0x1.0000000000004p-500 -0x1p-1000 mpfr libm RNDN: -0x0p+0 -0x0p+0 RNDU: -0x0p+0 -0x0p+0 RNDD: -0x1p-1074 -0x1p-1074 RNDZ: -0x0p+0 -0x0p+0 -- You are receiving this mail because: You are the assignee for the bug.