wasmer/lib/emscripten-tests/emtests/test_negative_zero.c

58 lines
1.2 KiB
C

/*
* Copyright 2016 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
#include <stdio.h>
#include <math.h>
// test copysign of 0
int __attribute__((noinline))
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;
}