#include extern void abort (void); extern void exit (int); #define NEQ(a, b) (fabs((a) - (b)) > 0.000001) #define DECL_FUNC(TYPE1, TYPE2, ROUND) \ __attribute__ ((noinline, noclone)) TYPE2 \ convert_##TYPE1##_to_##TYPE2##_##ROUND (TYPE1 N) \ { \ return ROUND (N); \ } #define DECL_ALL_ROUNDS_FOR(ROUND_FUNC) \ DECL_FUNC(float, float, ROUND_FUNC) \ DECL_FUNC(double, double, ROUND_FUNC) \ DECL_FUNC(double, int, ROUND_FUNC) \ DECL_FUNC(double, long, ROUND_FUNC) \ DECL_FUNC(float, int, ROUND_FUNC) \ DECL_FUNC(float, long, ROUND_FUNC) DECL_ALL_ROUNDS_FOR(round) DECL_ALL_ROUNDS_FOR(ceil) DECL_ALL_ROUNDS_FOR(floor) DECL_ALL_ROUNDS_FOR(trunc) DECL_ALL_ROUNDS_FOR(nearbyint) #define TEST_ROUND(TYPE1, TYPE2, N, N_R, ROUND) \ if (NEQ (convert_##TYPE1##_to_##TYPE2##_##ROUND (N), N_R)) \ abort (); int main () { /* Round */ TEST_ROUND(double, double, -4.8, -5.0, round); TEST_ROUND(double, double, -4.2, -4.0, round); TEST_ROUND(double, double, 4.8, 5.0, round); TEST_ROUND(double, double, 4.2, 4.0, round); TEST_ROUND(double, int, -4.8, -5, round); TEST_ROUND(double, int, -4.2, -4, round); TEST_ROUND(double, int, 4.8, 5, round); TEST_ROUND(double, int, 4.2, 4, round); TEST_ROUND(double, long, -4.8, -5, round); TEST_ROUND(double, long, -4.2, -4, round); TEST_ROUND(double, long, 4.8, 5, round); TEST_ROUND(double, long, 4.2, 4, round); TEST_ROUND(float, long, -4.8, -5, round); TEST_ROUND(float, long, -4.2, -4, round); TEST_ROUND(float, long, 4.8, 5, round); TEST_ROUND(float, long, 4.2, 4, round); /* Ceil */ TEST_ROUND(double, double, -4.8, -4.0, ceil); TEST_ROUND(double, double, -4.2, -4.0, ceil); TEST_ROUND(double, double, 4.8, 5.0, ceil); TEST_ROUND(double, double, 4.2, 5.0, ceil); TEST_ROUND(double, int, -4.8, -4, ceil); TEST_ROUND(double, int, -4.2, -4, ceil); TEST_ROUND(double, int, 4.8, 5, ceil); TEST_ROUND(double, int, 4.2, 5, ceil); TEST_ROUND(double, long, -4.8, -4, ceil); TEST_ROUND(double, long, -4.2, -4, ceil); TEST_ROUND(double, long, 4.8, 5, ceil); TEST_ROUND(double, long, 4.2, 5, ceil); TEST_ROUND(float, long, -4.8, -4, ceil); TEST_ROUND(float, long, -4.2, -4, ceil); TEST_ROUND(float, long, 4.8, 5, ceil); TEST_ROUND(float, long, 4.2, 5, ceil); /* Floor */ TEST_ROUND(double, double, -4.8, -5.0, floor); TEST_ROUND(double, double, -4.2, -5.0, floor); TEST_ROUND(double, double, 4.8, 4.0, floor); TEST_ROUND(double, double, 4.2, 4.0, floor); TEST_ROUND(double, int, -4.8, -5, floor); TEST_ROUND(double, int, -4.2, -5, floor); TEST_ROUND(double, int, 4.8, 4, floor); TEST_ROUND(double, int, 4.2, 4, floor); TEST_ROUND(double, long, -4.8, -5, floor); TEST_ROUND(double, long, -4.2, -5, floor); TEST_ROUND(double, long, 4.8, 4, floor); TEST_ROUND(double, long, 4.2, 4, floor); TEST_ROUND(float, long, -4.8, -5, floor); TEST_ROUND(float, long, -4.2, -5, floor); TEST_ROUND(float, long, 4.8, 4, floor); TEST_ROUND(float, long, 4.2, 4, floor); /* Trunc */ TEST_ROUND(double, double, -4.8, -4.0, trunc); TEST_ROUND(double, double, -4.2, -4.0, trunc); TEST_ROUND(double, double, 4.8, 4.0, trunc); TEST_ROUND(double, double, 4.2, 4.0, trunc); TEST_ROUND(double, int, -4.8, -4, trunc); TEST_ROUND(double, int, -4.2, -4, trunc); TEST_ROUND(double, int, 4.8, 4, trunc); TEST_ROUND(double, int, 4.2, 4, trunc); TEST_ROUND(double, long, -4.8, -4, trunc); TEST_ROUND(double, long, -4.2, -4, trunc); TEST_ROUND(double, long, 4.8, 4, trunc); TEST_ROUND(double, long, 4.2, 4, trunc); TEST_ROUND(float, long, -4.8, -4, trunc); TEST_ROUND(float, long, -4.2, -4, trunc); TEST_ROUND(float, long, 4.8, 4, trunc); TEST_ROUND(float, long, 4.2, 4, trunc); /* Nearbyint */ TEST_ROUND(double, double, -4.8, -5.0, nearbyint); TEST_ROUND(double, double, -4.2, -4.0, nearbyint); TEST_ROUND(double, double, 4.8, 5.0, nearbyint); TEST_ROUND(double, double, 4.2, 4.0, nearbyint); TEST_ROUND(double, int, -4.8, -5, nearbyint); TEST_ROUND(double, int, -4.2, -4, nearbyint); TEST_ROUND(double, int, 4.8, 5, nearbyint); TEST_ROUND(double, int, 4.2, 4, nearbyint); TEST_ROUND(double, long, -4.8, -5, nearbyint); TEST_ROUND(double, long, -4.2, -4, nearbyint); TEST_ROUND(double, long, 4.8, 5, nearbyint); TEST_ROUND(double, long, 4.2, 4, nearbyint); TEST_ROUND(float, long, -4.8, -5, nearbyint); TEST_ROUND(float, long, -4.2, -4, nearbyint); TEST_ROUND(float, long, 4.8, 5, nearbyint); TEST_ROUND(float, long, 4.2, 4, nearbyint); exit(0); }