Test case: // gcc main.c -std=c99 -lm #include <stdio.h> #include <fenv.h> #include <stdlib.h> // abs function for int argument extern float j0f(float); extern double j0(double); #define i32(a) (((int*)&(a))[0]) int main() { float a,r1,r2; i32(a)=0x413caa1f; //argument fesetround(FE_TONEAREST); r1 = j0f(a); //actual result r2 = j0(a); //actual result 2 printf("inputs: a = (0x%08x)\t%e\n", i32(a), a); printf("actual = (0x%08x)\t%.13e\n", i32(r1), r1); printf("expected = (0x%08x)\t%.13e\n", i32(r2), r2); printf("error = %d ulp\n", abs(i32(r1) - i32(r2))); return 0; } Result: inputs: a = (0x413caa1f) 1.179153e+01 actual = (0xb471e828) -2.2529331999976e-07 expected = (0xb471d452) -2.2522115727952e-07 error = 5078 ulp
Duplicate, was filed twice due to network connection problems. *** This bug has been marked as a duplicate of bug 14469 ***
Could you please give versions of the tests, for all your recent bugs, that represent the test argument using a hex float value rather than by violating ISO C aliasing rules (type punning int and float)? Hex float values are generally more convenient to deal with; you can put them directly in tests in libm-test.inc, or use them with MPFR to confirm the correct results.