https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113353
Jeevitha <jeevitha at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jeevitha at gcc dot gnu.org
--- Comment #2 from Jeevitha <jeevitha at gcc dot gnu.org> ---
For below testcase:
#include <cfenv>
#include <cmath>
#include <iostream>
#pragma STDC FENV_ACCESS ON
int main()
{
std::fesetround(FE_TONEAREST);
std::cout << "rounding to nearest: \n"
<< "nearbyint(+2.3) = " << std::nearbyint(2.3)
<< " nearbyint(+2.5) = " << std::nearbyint(2.5)
<< " nearbyint(+3.5) = " << std::nearbyint(3.5) << '\n'
<< "nearbyint(-2.3) = " << std::nearbyint(-2.3)
<< " nearbyint(-2.5) = " << std::nearbyint(-2.5)
<< " nearbyint(-3.5) = " << std::nearbyint(-3.5) << '\n';
std::fesetround(FE_DOWNWARD);
std::cout << "rounding down:\n"
<< "nearbyint(+2.3) = " << std::nearbyint(2.3)
<< " nearbyint(+2.5) = " << std::nearbyint(2.5)
<< " nearbyint(+3.5) = " << std::nearbyint(3.5) << '\n'
<< "nearbyint(-2.3) = " << std::nearbyint(-2.3)
<< " nearbyint(-2.5) = " << std::nearbyint(-2.5)
<< " nearbyint(-3.5) = " << std::nearbyint(-3.5) << '\n';
std::cout << "nearbyint(-0.0) = " << std::nearbyint(-0.0) << '\n'
<< "nearbyint(-Inf) = " << std::nearbyint(-INFINITY) << '\n';
}
Expected output is:
rounding to nearest:
nearbyint(+2.3) = 2 nearbyint(+2.5) = 2 nearbyint(+3.5) = 4
nearbyint(-2.3) = -2 nearbyint(-2.5) = -2 nearbyint(-3.5) = -4
rounding down:
nearbyint(+2.3) = 2 nearbyint(+2.5) = 2 nearbyint(+3.5) = 3
nearbyint(-2.3) = -3 nearbyint(-2.5) = -3 nearbyint(-3.5) = -4
nearbyint(-0.0) = -0
nearbyint(-Inf) = -inf
With -O3, we are generating incorrect output, but -O0 seems correct.
This is not only for powerpc target; it seems x86 also has this problem.