http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59714
Bug ID: 59714
Summary: complex division is inaccurate on aarch64
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libgcc
Assignee: unassigned at gcc dot gnu.org
Reporter: michael.hudson at linaro dot org
Hi, it seems details in the rounding of complex division are wrong:
ubuntu@arm64:~$ cat cplx.c
#include <stdio.h>
int main(int argc, char** argv)
{
__complex double c = 1.0 + 3.0i;
printf("%g\n", __imag__ (c/c));
}
ubuntu@arm64:~$ gcc cplx.c -o cplx
ubuntu@arm64:~$ ./cplx
-1.66533e-17
This is because libgcc2.c is compiled in a way that lets the compiler used
fused multiply add instructions. It shouldn't be!
(in this particular case, it's because if x is the closest float64 to 1/3,
evaluating "3*x - 1" using fnmsub does not yield 0 because of the lack of
intermediate rounding. Evaluating 3*x, rounding it, and then subtracting 1 does
yield 0).