I wrote a small program to compute the Euclidean norm of a 3-coordinate vector. Here it is:
#include
#include
#include
As @MatthiasB pointed out, this seems to be an issue of gcc temporarily storing an 80 bit floating point value into a 64 bit register/memory location. Consider the following simplified program which still reproduces the issue:
#include
#include
double norm() {
double res = 4.0 * 4.0 + (-2.0 * -2.0) + (6.0 * 6.0);
return std::sqrt(res);
}
int main() {
std::cout << norm() - norm() << '\n';
return 0;
}
The assembly code of the essential part norm() - norm()
looks like this (using 32 bit mingw 4.8.0 compiler)
...
call __Z4normv ; call norm()
fstpl -16(%ebp) ; store result (80 bit) in temporary (64 bit!)
call __Z4normv ; call norm() again
fsubrl -16(%ebp) ; subtract result (80 bit) from temporary (64 bit!)
...
Essentially, I would consider this a gcc bug, but it seems to be a complicated topic ...