| #include <stdio.h> |
| #include <math.h> |
| |
| // test copysign of 0 |
| int __attribute__((noinline,noclone)) |
| copysign_bug (double x) |
| { |
| if (x != 0.0 && (x * 0.5 == x)) { |
| printf("1\n"); |
| return 1; |
| } |
| printf("f: %f\n", x); |
| if (__builtin_copysign(1.0, x) < 0.0) { |
| printf("2\n"); |
| return 2; |
| } else { |
| printf("3\n"); |
| return 3; |
| } |
| } |
| |
| int main() { |
| #define TEST(x, y) printf("%.2f, %.2f ==> %.2f\n", x, y, copysign(x, y)); |
| TEST(5.0f, 5.0f); |
| TEST(5.0f, -5.0f); |
| TEST(-5.0f, 5.0f); |
| TEST(-5.0f, -5.0f); |
| TEST(5.0f, 4.0f); |
| TEST(5.0f, -4.0f); |
| TEST(-5.0f, 4.0f); |
| TEST(-5.0f, -4.0f); |
| TEST(0.0f, 5.0f); |
| TEST(0.0f, -5.0f); |
| TEST(-0.0f, 5.0f); |
| TEST(-0.0f, -5.0f); |
| TEST(5.0f, 0.0f); |
| TEST(5.0f, -0.0f); |
| TEST(-5.0f, 0.0f); |
| TEST(-5.0f, -0.0f); |
| TEST(0.0f, 0.0f); |
| TEST(0.0f, -0.0f); |
| TEST(-0.0f, 0.0f); |
| TEST(-0.0f, -0.0f); |
| |
| double x = -0.0; |
| if (copysign_bug (x) != 2) |
| __builtin_abort (); |
| |
| return 0; |
| } |