diff options
author | OverMighty <its.overmighty@gmail.com> | 2024-03-28 17:08:14 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-28 13:08:14 -0400 |
commit | 6aee1f9d1833f7ac000f6451a5d440b3a321a557 (patch) | |
tree | da500f8599c1798cb7fc37dbf97cd71a6ae7b8f0 | |
parent | 8dcff10e9b7405138af768ec89d0718e048ca340 (diff) | |
download | llvm-6aee1f9d1833f7ac000f6451a5d440b3a321a557.zip llvm-6aee1f9d1833f7ac000f6451a5d440b3a321a557.tar.gz llvm-6aee1f9d1833f7ac000f6451a5d440b3a321a557.tar.bz2 |
[libc][math][c23] Fix bounds checking and add FE_INVALID raising in {,u}fromfp{,x}* (#86892)
See
https://github.com/llvm/llvm-project/pull/86692#issuecomment-2024044889
and
https://github.com/llvm/llvm-project/pull/86892#discussion_r1542276037.
cc @lntue @nickdesaulniers
-rw-r--r-- | libc/src/__support/FPUtil/NearestIntegerOperations.h | 52 | ||||
-rw-r--r-- | libc/test/src/math/smoke/FromfpTest.h | 350 | ||||
-rw-r--r-- | libc/test/src/math/smoke/FromfpxTest.h | 350 | ||||
-rw-r--r-- | libc/test/src/math/smoke/UfromfpTest.h | 352 | ||||
-rw-r--r-- | libc/test/src/math/smoke/UfromfpxTest.h | 352 |
5 files changed, 975 insertions, 481 deletions
diff --git a/libc/src/__support/FPUtil/NearestIntegerOperations.h b/libc/src/__support/FPUtil/NearestIntegerOperations.h index 5795840..6b28e7f 100644 --- a/libc/src/__support/FPUtil/NearestIntegerOperations.h +++ b/libc/src/__support/FPUtil/NearestIntegerOperations.h @@ -247,8 +247,22 @@ round_using_current_rounding_mode(T x) { template <bool IsSigned, typename T> LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<T>, T> fromfp(T x, int rnd, unsigned int width) { - if (width == 0U) + using StorageType = typename FPBits<T>::StorageType; + + constexpr StorageType EXPLICIT_BIT = + FPBits<T>::SIG_MASK - FPBits<T>::FRACTION_MASK; + + if (width == 0U) { + raise_except_if_required(FE_INVALID); + return FPBits<T>::quiet_nan().get_val(); + } + + FPBits<T> bits(x); + + if (bits.is_inf_or_nan()) { + raise_except_if_required(FE_INVALID); return FPBits<T>::quiet_nan().get_val(); + } T rounded_value = round_using_specific_rounding_mode(x, rnd); @@ -256,18 +270,46 @@ fromfp(T x, int rnd, unsigned int width) { // T can't hold a finite number >= 2.0 * 2^EXP_BIAS. if (width - 1 > FPBits<T>::EXP_BIAS) return rounded_value; - if (rounded_value < -T(1U << (width - 1U))) + + StorageType range_exp = width - 1U + FPBits<T>::EXP_BIAS; + // rounded_value < -2^(width - 1) + T range_min = + FPBits<T>::create_value(Sign::NEG, range_exp, EXPLICIT_BIT).get_val(); + if (rounded_value < range_min) { + raise_except_if_required(FE_INVALID); return FPBits<T>::quiet_nan().get_val(); - if (rounded_value > T((1U << (width - 1U)) - 1U)) + } + // rounded_value > 2^(width - 1) - 1 + T range_max = + FPBits<T>::create_value(Sign::POS, range_exp, EXPLICIT_BIT).get_val() - + T(1.0); + if (rounded_value > range_max) { + raise_except_if_required(FE_INVALID); return FPBits<T>::quiet_nan().get_val(); + } + return rounded_value; } - if (rounded_value < T(0.0)) + if (rounded_value < T(0.0)) { + raise_except_if_required(FE_INVALID); return FPBits<T>::quiet_nan().get_val(); + } + // T can't hold a finite number >= 2.0 * 2^EXP_BIAS. - if (width <= FPBits<T>::EXP_BIAS && rounded_value > T(1U << width) - 1U) + if (width > FPBits<T>::EXP_BIAS) + return rounded_value; + + StorageType range_exp = width + FPBits<T>::EXP_BIAS; + // rounded_value > 2^width - 1 + T range_max = + FPBits<T>::create_value(Sign::POS, range_exp, EXPLICIT_BIT).get_val() - + T(1.0); + if (rounded_value > range_max) { + raise_except_if_required(FE_INVALID); return FPBits<T>::quiet_nan().get_val(); + } + return rounded_value; } diff --git a/libc/test/src/math/smoke/FromfpTest.h b/libc/test/src/math/smoke/FromfpTest.h index 2d4c4c53..d3a61ba 100644 --- a/libc/test/src/math/smoke/FromfpTest.h +++ b/libc/test/src/math/smoke/FromfpTest.h @@ -25,22 +25,22 @@ public: EXPECT_FP_EQ(zero, func(zero, rnd, 32U)); EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 32U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 32U), FE_INVALID); } } void testSpecialNumbersZeroWidth(FromfpFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(zero, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_zero, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(zero, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_zero, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 0U), FE_INVALID); } } @@ -52,16 +52,18 @@ public: EXPECT_FP_EQ(T(-10.0), func(T(-10.0), rnd, 5U)); EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 12U)); EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0), rnd, 12U)); + EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 65U)); + EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0), rnd, 65U)); } } void testRoundedNumbersOutsideRange(FromfpFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(T(1.0), rnd, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.0), rnd, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.0), rnd, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.0), rnd, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.0), rnd, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.0), rnd, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.0), rnd, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.0), rnd, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.0), rnd, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.0), rnd, 11U), FE_INVALID); } } @@ -89,20 +91,34 @@ public: } void testFractionsUpwardOutsideRange(FromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.5), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(0.115), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(0.715), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_UPWARD, 2U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_UPWARD, 2U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_UPWARD, 2U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_UPWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_UPWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_UPWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_UPWARD, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.5), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.115), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.715), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_UPWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_UPWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_UPWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_UPWARD, 11U), + FE_INVALID); } void testFractionsDownwardWithinRange(FromfpFunc func) { @@ -129,20 +145,34 @@ public: } void testFractionsDownwardOutsideRange(FromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 11U), + FE_INVALID); } void testFractionsTowardZeroWithinRange(FromfpFunc func) { @@ -169,17 +199,28 @@ public: } void testFractionsTowardZeroOutsideRange(FromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_TOWARDZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TOWARDZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TOWARDZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_TOWARDZERO, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TOWARDZERO, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TOWARDZERO, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 11U), + FE_INVALID); } void testFractionsToNearestFromZeroWithinRange(FromfpFunc func) { @@ -206,21 +247,36 @@ public: } void testFractionsToNearestFromZeroOutsideRange(FromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); } void testFractionsToNearestWithinRange(FromfpFunc func) { @@ -260,33 +316,59 @@ public: } void testFractionsToNearestOutsideRange(FromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.715), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEAREST, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEAREST, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.715), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TONEAREST, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TONEAREST, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 11U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), FP_INT_TONEAREST, 3U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 3U), + FE_INVALID); } void testFractionsToNearestFallbackWithinRange(FromfpFunc func) { @@ -332,33 +414,63 @@ public: } void testFractionsToNearestFallbackOutsideRange(FromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); } }; diff --git a/libc/test/src/math/smoke/FromfpxTest.h b/libc/test/src/math/smoke/FromfpxTest.h index b3c14c7..f3a1680 100644 --- a/libc/test/src/math/smoke/FromfpxTest.h +++ b/libc/test/src/math/smoke/FromfpxTest.h @@ -25,22 +25,22 @@ public: EXPECT_FP_EQ(zero, func(zero, rnd, 32U)); EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 32U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 32U), FE_INVALID); } } void testSpecialNumbersZeroWidth(FromfpxFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(zero, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_zero, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(zero, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_zero, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 0U), FE_INVALID); } } @@ -52,16 +52,18 @@ public: EXPECT_FP_EQ(T(-10.0), func(T(-10.0), rnd, 5U)); EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 12U)); EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0), rnd, 12U)); + EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 65U)); + EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0), rnd, 65U)); } } void testRoundedNumbersOutsideRange(FromfpxFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(T(1.0), rnd, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.0), rnd, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.0), rnd, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.0), rnd, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.0), rnd, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.0), rnd, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.0), rnd, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.0), rnd, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.0), rnd, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.0), rnd, 11U), FE_INVALID); } } @@ -109,20 +111,34 @@ public: } void testFractionsUpwardOutsideRange(FromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.5), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(0.115), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(0.715), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_UPWARD, 2U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_UPWARD, 2U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_UPWARD, 2U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_UPWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_UPWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_UPWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_UPWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_UPWARD, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.5), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.115), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.715), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_UPWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_UPWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_UPWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_UPWARD, 11U), + FE_INVALID); } void testFractionsDownwardWithinRange(FromfpxFunc func) { @@ -169,20 +185,34 @@ public: } void testFractionsDownwardOutsideRange(FromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 11U), + FE_INVALID); } void testFractionsTowardZeroWithinRange(FromfpxFunc func) { @@ -229,17 +259,28 @@ public: } void testFractionsTowardZeroOutsideRange(FromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_TOWARDZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TOWARDZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TOWARDZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_TOWARDZERO, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TOWARDZERO, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TOWARDZERO, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 11U), + FE_INVALID); } void testFractionsToNearestFromZeroWithinRange(FromfpxFunc func) { @@ -288,21 +329,36 @@ public: } void testFractionsToNearestFromZeroOutsideRange(FromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 11U), FE_INVALID); } void testFractionsToNearestWithinRange(FromfpxFunc func) { @@ -374,33 +430,59 @@ public: } void testFractionsToNearestOutsideRange(FromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.715), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEAREST, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEAREST, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEAREST, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.715), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 4U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TONEAREST, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TONEAREST, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 11U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), FP_INT_TONEAREST, 3U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 3U), + FE_INVALID); } void testFractionsToNearestFallbackWithinRange(FromfpxFunc func) { @@ -494,33 +576,63 @@ public: } void testFractionsToNearestFallbackOutsideRange(FromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 11U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); } }; diff --git a/libc/test/src/math/smoke/UfromfpTest.h b/libc/test/src/math/smoke/UfromfpTest.h index e753fc4..9ad1e6d 100644 --- a/libc/test/src/math/smoke/UfromfpTest.h +++ b/libc/test/src/math/smoke/UfromfpTest.h @@ -25,22 +25,22 @@ public: EXPECT_FP_EQ(zero, func(zero, rnd, 32U)); EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 32U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 32U), FE_INVALID); } } void testSpecialNumbersZeroWidth(UfromfpFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(zero, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_zero, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(zero, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_zero, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 0U), FE_INVALID); } } @@ -49,16 +49,17 @@ public: EXPECT_FP_EQ(T(1.0), func(T(1.0), rnd, 1U)); EXPECT_FP_EQ(T(10.0), func(T(10.0), rnd, 4U)); EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 11U)); + EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 64U)); } } void testRoundedNumbersOutsideRange(UfromfpFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(T(-1.0), rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.0), rnd, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.0), rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.0), rnd, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.0), rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.0), rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.0), rnd, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.0), rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.0), rnd, 10U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.0), rnd, 32U), FE_INVALID); } } @@ -79,20 +80,34 @@ public: } void testFractionsUpwardOutsideRange(UfromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_UPWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_UPWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_UPWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_UPWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_UPWARD, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_UPWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_UPWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_UPWARD, 32U), + FE_INVALID); } void testFractionsDownwardWithinRange(UfromfpFunc func) { @@ -109,20 +124,34 @@ public: } void testFractionsDownwardOutsideRange(UfromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 32U), + FE_INVALID); } void testFractionsTowardZeroWithinRange(UfromfpFunc func) { @@ -142,17 +171,28 @@ public: } void testFractionsTowardZeroOutsideRange(UfromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 32U), + FE_INVALID); } void testFractionsToNearestFromZeroWithinRange(UfromfpFunc func) { @@ -170,21 +210,36 @@ public: } void testFractionsToNearestFromZeroOutsideRange(UfromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 10U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 10U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); } void testFractionsToNearestWithinRange(UfromfpFunc func) { @@ -210,33 +265,59 @@ public: } void testFractionsToNearestOutsideRange(UfromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEAREST, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEAREST, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TONEAREST, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TONEAREST, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 32U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U), + FE_INVALID); } void testFractionsToNearestFallbackWithinRange(UfromfpFunc func) { @@ -264,33 +345,66 @@ public: } void testFractionsToNearestFallbackOutsideRange(UfromfpFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); } }; diff --git a/libc/test/src/math/smoke/UfromfpxTest.h b/libc/test/src/math/smoke/UfromfpxTest.h index 47bf32c..09163b8 100644 --- a/libc/test/src/math/smoke/UfromfpxTest.h +++ b/libc/test/src/math/smoke/UfromfpxTest.h @@ -25,22 +25,22 @@ public: EXPECT_FP_EQ(zero, func(zero, rnd, 32U)); EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 32U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 32U), FE_INVALID); } } void testSpecialNumbersZeroWidth(UfromfpxFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(zero, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_zero, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(zero, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_zero, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(inf, rnd, 0U)); - EXPECT_FP_EQ(aNaN, func(neg_inf, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 0U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 0U), FE_INVALID); - EXPECT_FP_EQ(aNaN, func(aNaN, rnd, 0U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 0U), FE_INVALID); } } @@ -49,16 +49,17 @@ public: EXPECT_FP_EQ(T(1.0), func(T(1.0), rnd, 1U)); EXPECT_FP_EQ(T(10.0), func(T(10.0), rnd, 4U)); EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 11U)); + EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 64U)); } } void testRoundedNumbersOutsideRange(UfromfpxFunc func) { for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) { - EXPECT_FP_EQ(aNaN, func(T(-1.0), rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.0), rnd, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.0), rnd, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.0), rnd, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.0), rnd, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.0), rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.0), rnd, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.0), rnd, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.0), rnd, 10U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.0), rnd, 32U), FE_INVALID); } } @@ -92,20 +93,34 @@ public: } void testFractionsUpwardOutsideRange(UfromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(1.3), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_UPWARD, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_UPWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_UPWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_UPWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_UPWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_UPWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_UPWARD, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_UPWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_UPWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_UPWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_UPWARD, 32U), + FE_INVALID); } void testFractionsDownwardWithinRange(UfromfpxFunc func) { @@ -132,20 +147,34 @@ public: } void testFractionsDownwardOutsideRange(UfromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_DOWNWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_DOWNWARD, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_DOWNWARD, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_DOWNWARD, 32U), + FE_INVALID); } void testFractionsTowardZeroWithinRange(UfromfpxFunc func) { @@ -178,17 +207,28 @@ public: } void testFractionsTowardZeroOutsideRange(UfromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TOWARDZERO, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TOWARDZERO, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TOWARDZERO, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TOWARDZERO, 32U), + FE_INVALID); } void testFractionsToNearestFromZeroWithinRange(UfromfpxFunc func) { @@ -217,21 +257,36 @@ public: } void testFractionsToNearestFromZeroOutsideRange(UfromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), FP_INT_TONEARESTFROMZERO, 10U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), FP_INT_TONEARESTFROMZERO, 10U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID); } void testFractionsToNearestWithinRange(UfromfpxFunc func) { @@ -275,33 +330,59 @@ public: } void testFractionsToNearestOutsideRange(UfromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), FP_INT_TONEAREST, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), FP_INT_TONEAREST, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.38), FP_INT_TONEAREST, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.38), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.96), FP_INT_TONEAREST, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.96), FP_INT_TONEAREST, 32U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U), + FE_INVALID); } void testFractionsToNearestFallbackWithinRange(UfromfpxFunc func) { @@ -353,33 +434,66 @@ public: } void testFractionsToNearestFallbackOutsideRange(UfromfpxFunc func) { - EXPECT_FP_EQ(aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U)); - EXPECT_FP_EQ(aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U)); - EXPECT_FP_EQ(aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 10U), + FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-1234.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), + FE_INVALID); - EXPECT_FP_EQ(aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U)); - EXPECT_FP_EQ(aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); - EXPECT_FP_EQ(aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U)); - EXPECT_FP_EQ(aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U)); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION( + aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID); } }; |