[libc][math] Fix signaling NaN handling for math functions. (#133347)
Add tests for signaling NaNs, and fix function behavior for handling signaling NaN input. Fixes https://github.com/llvm/llvm-project/issues/124812
This commit is contained in:
@@ -4169,7 +4169,9 @@ add_entrypoint_object(
|
||||
atan2f_float.h
|
||||
DEPENDS
|
||||
.inv_trigf_utils
|
||||
libc.hdr.fenv_macros
|
||||
libc.src.__support.FPUtil.double_double
|
||||
libc.src.__support.FPUtil.fenv_impl
|
||||
libc.src.__support.FPUtil.fp_bits
|
||||
libc.src.__support.FPUtil.multiply_add
|
||||
libc.src.__support.FPUtil.nearest_integer
|
||||
@@ -4187,6 +4189,7 @@ add_entrypoint_object(
|
||||
DEPENDS
|
||||
.atan_utils
|
||||
libc.src.__support.FPUtil.double_double
|
||||
libc.src.__support.FPUtil.fenv_impl
|
||||
libc.src.__support.FPUtil.fp_bits
|
||||
libc.src.__support.FPUtil.multiply_add
|
||||
libc.src.__support.FPUtil.nearest_integer
|
||||
|
||||
@@ -84,10 +84,17 @@ LLVM_LIBC_FUNCTION(float, acosf, (float x)) {
|
||||
0x1.921fb6p+1f)
|
||||
: /* x == 1.0f */ 0.0f;
|
||||
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
// |x| <= +/-inf
|
||||
if (x_abs <= 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
}
|
||||
|
||||
return x + FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
|
||||
@@ -108,10 +108,16 @@ LLVM_LIBC_FUNCTION(float, asinf, (float x)) {
|
||||
|
||||
// |x| > 1, return NaNs.
|
||||
if (LIBC_UNLIKELY(x_abs > 0x3f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (x_abs <= 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
}
|
||||
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
|
||||
@@ -61,8 +61,14 @@ LLVM_LIBC_FUNCTION(float, asinhf, (float x)) {
|
||||
};
|
||||
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x4bdd'65a5U)) {
|
||||
if (LIBC_UNLIKELY(xbits.is_inf_or_nan()))
|
||||
if (LIBC_UNLIKELY(xbits.is_inf_or_nan())) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits_t::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
// Exceptional cases when x > 2^24.
|
||||
switch (x_abs) {
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include "src/math/atan2.h"
|
||||
#include "atan_utils.h"
|
||||
#include "src/__support/FPUtil/FEnvImpl.h"
|
||||
#include "src/__support/FPUtil/FPBits.h"
|
||||
#include "src/__support/FPUtil/double_double.h"
|
||||
#include "src/__support/FPUtil/multiply_add.h"
|
||||
@@ -111,8 +112,11 @@ LLVM_LIBC_FUNCTION(double, atan2, (double y, double x)) {
|
||||
// Check for exceptional cases, whether inputs are 0, inf, nan, or close to
|
||||
// overflow, or close to underflow.
|
||||
if (LIBC_UNLIKELY(max_exp > 0x7ffU - 128U || min_exp < 128U)) {
|
||||
if (x_bits.is_nan() || y_bits.is_nan())
|
||||
if (x_bits.is_nan() || y_bits.is_nan()) {
|
||||
if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan())
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
unsigned x_except = x == 0.0 ? 0 : (FPBits(x_abs).is_inf() ? 2 : 1);
|
||||
unsigned y_except = y == 0.0 ? 0 : (FPBits(y_abs).is_inf() ? 2 : 1);
|
||||
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "src/math/atan2f.h"
|
||||
#include "hdr/fenv_macros.h"
|
||||
#include "inv_trigf_utils.h"
|
||||
#include "src/__support/FPUtil/FEnvImpl.h"
|
||||
#include "src/__support/FPUtil/FPBits.h"
|
||||
#include "src/__support/FPUtil/PolyEval.h"
|
||||
#include "src/__support/FPUtil/double_double.h"
|
||||
@@ -264,8 +266,11 @@ LLVM_LIBC_FUNCTION(float, atan2f, (float y, float x)) {
|
||||
double den_d = static_cast<double>(den_f);
|
||||
|
||||
if (LIBC_UNLIKELY(max_abs >= 0x7f80'0000U || num_d == 0.0)) {
|
||||
if (x_bits.is_nan() || y_bits.is_nan())
|
||||
if (x_bits.is_nan() || y_bits.is_nan()) {
|
||||
if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan())
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
double x_d = static_cast<double>(x);
|
||||
double y_d = static_cast<double>(y);
|
||||
size_t x_except = (x_d == 0.0) ? 0 : (x_abs == 0x7f80'0000 ? 2 : 1);
|
||||
|
||||
@@ -24,6 +24,10 @@ LLVM_LIBC_FUNCTION(float, atanhf, (float x)) {
|
||||
// |x| >= 1.0
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x3F80'0000U)) {
|
||||
if (xbits.is_nan()) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
return x;
|
||||
}
|
||||
// |x| == 1.0
|
||||
|
||||
@@ -65,7 +65,11 @@ LLVM_LIBC_FUNCTION(double, cos, (double x)) {
|
||||
} else {
|
||||
// Inf or NaN
|
||||
if (LIBC_UNLIKELY(x_e > 2 * FPBits::EXP_BIAS)) {
|
||||
// sin(+-Inf) = NaN
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
// cos(+-Inf) = NaN
|
||||
if (xbits.get_mantissa() == 0) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -117,6 +117,11 @@ LLVM_LIBC_FUNCTION(float, cosf, (float x)) {
|
||||
|
||||
// x is inf or nan.
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (x_abs == 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -67,6 +67,11 @@ LLVM_LIBC_FUNCTION(float16, cosf16, (float16 x)) {
|
||||
|
||||
// cos(+/-inf) = NaN, and cos(NaN) = NaN
|
||||
if (xbits.is_inf_or_nan()) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (xbits.is_inf()) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -66,6 +66,11 @@ LLVM_LIBC_FUNCTION(float, cospif, (float x)) {
|
||||
|
||||
// x is inf or nan.
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (x_abs == 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -54,6 +54,10 @@ LLVM_LIBC_FUNCTION(float16, cospif16, (float16 x)) {
|
||||
|
||||
// Check for NaN or infintiy values
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7c00)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
// If value is equal to infinity
|
||||
if (x_abs == 0x7c00) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
|
||||
@@ -135,6 +135,10 @@ LLVM_LIBC_FUNCTION(float, erff, (float x)) {
|
||||
int sign = xbits.is_neg() ? 1 : 0;
|
||||
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
return (x_abs > 0x7f80'0000) ? x : ONE[sign];
|
||||
}
|
||||
|
||||
|
||||
@@ -910,7 +910,12 @@ LLVM_LIBC_FUNCTION(double, log1p, (double x)) {
|
||||
return FPBits_t::quiet_nan().get_val();
|
||||
}
|
||||
// x is +Inf or NaN
|
||||
return x;
|
||||
if (xbits.is_inf() && xbits.is_pos())
|
||||
return x;
|
||||
|
||||
if (xbits.is_signaling_nan())
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits_t::quiet_nan().get_val();
|
||||
}
|
||||
x_dd.hi = x;
|
||||
} else {
|
||||
|
||||
@@ -132,6 +132,11 @@ LLVM_LIBC_FUNCTION(float, logf, (float x)) {
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
// x is +inf or nan
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,6 +217,11 @@ LLVM_LIBC_FUNCTION(double, pow, (double x, double y)) {
|
||||
uint64_t sign = 0;
|
||||
|
||||
///////// BEGIN - Check exceptional cases ////////////////////////////////////
|
||||
// If x or y is signaling NaN
|
||||
if (x_abs.is_signaling_nan() || y_abs.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
// The double precision number that is closest to 1 is (1 - 2^-53), which has
|
||||
// log2(1 - 2^-53) ~ -1.715...p-53.
|
||||
|
||||
@@ -664,6 +664,12 @@ LLVM_LIBC_FUNCTION(float, powf, (float x, float y)) {
|
||||
// |y * log2(x)| = 0 or > 151.
|
||||
// Hence x^y will either overflow or underflow if x is not zero.
|
||||
if (LIBC_UNLIKELY((y_abs & 0x0007'ffff) == 0) || (y_abs > 0x4f170000)) {
|
||||
// y is signaling NaN
|
||||
if (xbits.is_signaling_nan() || ybits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FloatBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
// Exceptional exponents.
|
||||
if (y == 0.0f)
|
||||
return 1.0f;
|
||||
@@ -736,8 +742,8 @@ LLVM_LIBC_FUNCTION(float, powf, (float x, float y)) {
|
||||
}
|
||||
}
|
||||
if (y_abs > 0x4f17'0000) {
|
||||
// if y is NaN
|
||||
if (y_abs > 0x7f80'0000) {
|
||||
// y is NaN
|
||||
if (x_u == 0x3f80'0000) { // x = 1.0f
|
||||
// pow(1, NaN) = 1
|
||||
return 1.0f;
|
||||
@@ -759,6 +765,12 @@ LLVM_LIBC_FUNCTION(float, powf, (float x, float y)) {
|
||||
// y is finite and non-zero.
|
||||
if (LIBC_UNLIKELY(((x_u & 0x801f'ffffU) == 0) || x_u >= 0x7f80'0000U ||
|
||||
x_u < 0x0080'0000U)) {
|
||||
// if x is signaling NaN
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FloatBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
switch (x_u) {
|
||||
case 0x3f80'0000: // x = 1.0f
|
||||
return 1.0f;
|
||||
|
||||
@@ -77,6 +77,11 @@ LLVM_LIBC_FUNCTION(double, sin, (double x)) {
|
||||
// Inf or NaN
|
||||
if (LIBC_UNLIKELY(x_e > 2 * FPBits::EXP_BIAS)) {
|
||||
// sin(+-Inf) = NaN
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (xbits.get_mantissa() == 0) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -85,6 +85,12 @@ LLVM_LIBC_FUNCTION(void, sincos, (double x, double *sin_x, double *cos_x)) {
|
||||
} else {
|
||||
// Inf or NaN
|
||||
if (LIBC_UNLIKELY(x_e > 2 * FPBits::EXP_BIAS)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
*sin_x = *cos_x = FPBits::quiet_nan().get_val();
|
||||
return;
|
||||
}
|
||||
|
||||
// sin(+-Inf) = NaN
|
||||
if (xbits.get_mantissa() == 0) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
|
||||
@@ -145,6 +145,12 @@ LLVM_LIBC_FUNCTION(void, sincosf, (float x, float *sinp, float *cosp)) {
|
||||
|
||||
// x is inf or nan.
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
*sinp = *cosp = FPBits::quiet_nan().get_val();
|
||||
return;
|
||||
}
|
||||
|
||||
if (x_abs == 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -136,6 +136,11 @@ LLVM_LIBC_FUNCTION(float, sinf, (float x)) {
|
||||
#endif // !LIBC_MATH_HAS_SKIP_ACCURATE_PASS
|
||||
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (x_abs == 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -87,6 +87,11 @@ LLVM_LIBC_FUNCTION(float16, sinf16, (float16 x)) {
|
||||
}
|
||||
|
||||
if (xbits.is_inf_or_nan()) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (xbits.is_inf()) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -83,6 +83,11 @@ LLVM_LIBC_FUNCTION(float, sinpif, (float x)) {
|
||||
|
||||
// check for NaN values
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (x_abs == 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -50,6 +50,10 @@ LLVM_LIBC_FUNCTION(float16, sinpif16, (float16 x)) {
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x6400)) {
|
||||
// Check for NaN or infinity values
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7c00)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
// If value is equal to infinity
|
||||
if (x_abs == 0x7c00) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
|
||||
@@ -163,6 +163,10 @@ LLVM_LIBC_FUNCTION(double, tan, (double x)) {
|
||||
} else {
|
||||
// Inf or NaN
|
||||
if (LIBC_UNLIKELY(x_e > 2 * FPBits::EXP_BIAS)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
// tan(+-Inf) = NaN
|
||||
if (xbits.get_mantissa() == 0) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
|
||||
@@ -113,6 +113,11 @@ LLVM_LIBC_FUNCTION(float, tanf, (float x)) {
|
||||
if (LIBC_UNLIKELY(x_abs > 0x4d56'd354U)) {
|
||||
// Inf or NaN
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7f80'0000U)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
|
||||
if (x_abs == 0x7f80'0000U) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -84,6 +84,10 @@ LLVM_LIBC_FUNCTION(float16, tanf16, (float16 x)) {
|
||||
|
||||
// tan(+/-inf) = NaN, and tan(NaN) = NaN
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7c00)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
// x = +/-inf
|
||||
if (x_abs == 0x7c00) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
|
||||
@@ -63,6 +63,11 @@ LLVM_LIBC_FUNCTION(float16, tanpif16, (float16 x)) {
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x6400)) {
|
||||
// Check for NaN or infinity values
|
||||
if (LIBC_UNLIKELY(x_abs >= 0x7c00)) {
|
||||
if (xbits.is_signaling_nan()) {
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
return FPBits::quiet_nan().get_val();
|
||||
}
|
||||
// is inf
|
||||
if (x_abs == 0x7c00) {
|
||||
fputil::set_errno_if_required(EDOM);
|
||||
fputil::raise_except_if_required(FE_INVALID);
|
||||
|
||||
@@ -4262,6 +4262,7 @@ add_fp_unittest(
|
||||
SRCS
|
||||
pow_test.cpp
|
||||
DEPENDS
|
||||
libc.src.errno.errno
|
||||
libc.hdr.fenv_macros
|
||||
libc.src.math.pow
|
||||
)
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcAcosfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcAcosfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::acosf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::acosf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcAcoshfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcAcoshfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::acoshf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::acoshf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcAsinfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcAsinfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::asinf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::asinf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcAsinhfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcAsinhfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::asinhf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::asinhf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -13,6 +13,18 @@
|
||||
using LlvmLibcAtan2Test = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcAtan2Test, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2(sNaN, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2(sNaN, 1.0),
|
||||
FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2(1.0, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2(aNaN, zero));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2(1.0, aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(0.0, LIBC_NAMESPACE::atan2(zero, zero));
|
||||
|
||||
@@ -18,6 +18,18 @@ using LlvmLibcAtan2fTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcAtan2fTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(sNaN, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(sNaN, 1.0f),
|
||||
FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(1.0f, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
// TODO: Strengthen errno,exception checks and remove these assert macros
|
||||
// after new matchers/test fixtures are added see:
|
||||
// https://github.com/llvm/llvm-project/issues/90653.
|
||||
|
||||
@@ -13,10 +13,10 @@
|
||||
using LlvmLibcAtanTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcAtanTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan(aNaN));
|
||||
// atan(sNaN) = aNaN.
|
||||
EXPECT_EQ(FPBits(aNaN).uintval(),
|
||||
FPBits(LIBC_NAMESPACE::atan(sNaN)).uintval());
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::atan(zero));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(neg_zero, LIBC_NAMESPACE::atan(neg_zero));
|
||||
// atan(+-Inf) = +- pi/2.
|
||||
|
||||
@@ -19,6 +19,8 @@ using LlvmLibcAtanfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
|
||||
TEST_F(LlvmLibcAtanfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atanf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
// TODO: Strengthen errno,exception checks and remove these assert macros
|
||||
// after new matchers/test fixtures are added
|
||||
|
||||
@@ -21,7 +21,8 @@ using LlvmLibcAtanhfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
|
||||
TEST_F(LlvmLibcAtanhfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atanhf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
// TODO: Strengthen errno,exception checks and remove these assert macros
|
||||
// after new matchers/test fixtures are added, see:
|
||||
// https://github.com/llvm/llvm-project/issues/90653
|
||||
|
||||
@@ -15,6 +15,9 @@ using LlvmLibcCbrtTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
using LIBC_NAMESPACE::testing::tlog;
|
||||
|
||||
TEST_F(LlvmLibcCbrtTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cbrt(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::cbrt(aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::cbrt(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(neg_inf, LIBC_NAMESPACE::cbrt(neg_inf));
|
||||
|
||||
@@ -15,6 +15,9 @@ using LlvmLibcCbrtfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
using LIBC_NAMESPACE::testing::tlog;
|
||||
|
||||
TEST_F(LlvmLibcCbrtfTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cbrtf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::cbrtf(aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::cbrtf(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(neg_inf, LIBC_NAMESPACE::cbrtf(neg_inf));
|
||||
|
||||
@@ -15,6 +15,9 @@ using LlvmLibcCosTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
using LIBC_NAMESPACE::testing::tlog;
|
||||
|
||||
TEST_F(LlvmLibcCosTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cos(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::cos(aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::cos(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::cos(neg_inf));
|
||||
|
||||
@@ -16,6 +16,9 @@ using LlvmLibcCosf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
|
||||
TEST_F(LlvmLibcCosf16Test, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cosf16(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cosf16(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcCosfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcCosfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cosf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::cosf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -21,6 +21,9 @@ using LlvmLibcCoshfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcCoshfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::coshf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::coshf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@ using LlvmLibcCospif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
|
||||
TEST_F(LlvmLibcCospif16Test, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cospif16(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cospif16(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@ using LlvmLibcCospifTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcCospifTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::cospif(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::cospif(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
using LlvmLibcErffTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
|
||||
TEST_F(LlvmLibcErffTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::erff(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::erff(aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(1.0f, LIBC_NAMESPACE::erff(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(-1.0f, LIBC_NAMESPACE::erff(neg_inf));
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcExp10Test = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcExp10Test, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp10(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::exp10(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::exp10(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::exp10(neg_inf));
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcExp10fTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcExp10fTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp10f(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::exp10f(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -16,6 +16,9 @@ using LlvmLibcExp10m1fTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcExp10m1fTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp10m1f(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_EQ(FPBits(aNaN).uintval(),
|
||||
FPBits(LIBC_NAMESPACE::exp10m1f(aNaN)).uintval());
|
||||
EXPECT_EQ(FPBits(neg_aNaN).uintval(),
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcExp2Test = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcExp2Test, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp2(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::exp2(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::exp2(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::exp2(neg_inf));
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcExp2fTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcExp2fTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp2f(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::exp2f(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ using LIBC_NAMESPACE::fputil::testing::RoundingMode;
|
||||
TEST_F(LlvmLibcExp2m1fTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp2m1f(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::exp2m1f(aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::exp2m1f(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(-1.0f, LIBC_NAMESPACE::exp2m1f(neg_inf));
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcExpTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcExpTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::exp(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::exp(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::exp(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::exp(neg_inf));
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcExpfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcExpfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::expf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::expf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcExpm1Test = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcExpm1Test, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::expm1(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::expm1(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::expm1(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(-1.0, LIBC_NAMESPACE::expm1(neg_inf));
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcExpm1fTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcExpm1fTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::expm1f(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::expm1f(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcLog10Test = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcLog10Test, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::log10(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::log10(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::log10(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::log10(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
using LlvmLibcLog10fTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
|
||||
TEST_F(LlvmLibcLog10fTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::log10f(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::log10f(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::log10f(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::log10f(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
using LlvmLibcLog1pTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcLog1pTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::log1p(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::log1p(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::log1p(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::log1p(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcLog1pfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
|
||||
TEST_F(LlvmLibcLog1pfTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::log1pf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::log1pf(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::log1pf(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::log1pf(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcLog2Test = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcLog2Test, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::log2(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::log2(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::log2(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::log2(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcLog2fTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
|
||||
TEST_F(LlvmLibcLog2fTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::log2f(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::log2f(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::log2f(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::log2f(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
using LlvmLibcLogTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
|
||||
TEST_F(LlvmLibcLogTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::log(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::log(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::log(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::log(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
using LlvmLibcLogfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
|
||||
TEST_F(LlvmLibcLogfTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::logf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::logf(aNaN));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::logf(inf));
|
||||
EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::logf(neg_inf), FE_INVALID);
|
||||
|
||||
@@ -29,7 +29,33 @@ TEST_F(LlvmLibcPowTest, SpecialNumbers) {
|
||||
if (!__r.success)
|
||||
continue;
|
||||
|
||||
// pow( sNaN, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(sNaN, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::pow(sNaN, NEG_ODD_INTEGER), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::pow(sNaN, NEG_EVEN_INTEGER), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::pow(sNaN, POS_ODD_INTEGER), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::pow(sNaN, POS_EVEN_INTEGER), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(sNaN, ONE_HALF),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(sNaN, zero),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(sNaN, neg_zero),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(sNaN, inf),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(sNaN, neg_inf),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(sNaN, aNaN),
|
||||
FE_INVALID);
|
||||
|
||||
// pow( 0.0, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(zero, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::pow(zero, NEG_ODD_INTEGER),
|
||||
FE_DIVBYZERO);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
@@ -48,6 +74,8 @@ TEST_F(LlvmLibcPowTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::pow(zero, aNaN));
|
||||
|
||||
// pow( -0.0, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(neg_zero, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
neg_inf, LIBC_NAMESPACE::pow(neg_zero, NEG_ODD_INTEGER), FE_DIVBYZERO);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
@@ -66,6 +94,8 @@ TEST_F(LlvmLibcPowTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::pow(neg_zero, aNaN));
|
||||
|
||||
// pow( 1.0, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(1.0, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(1.0, zero));
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(1.0, neg_zero));
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(1.0, 1.0));
|
||||
@@ -80,7 +110,9 @@ TEST_F(LlvmLibcPowTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(1.0, neg_inf));
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(1.0, aNaN));
|
||||
|
||||
// pow( 1.0, exponent )
|
||||
// pow( -1.0, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(-1.0, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(-1.0, zero));
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(-1.0, neg_zero));
|
||||
EXPECT_FP_EQ(-1.0, LIBC_NAMESPACE::pow(-1.0, 1.0));
|
||||
@@ -98,6 +130,8 @@ TEST_F(LlvmLibcPowTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::pow(-1.0, aNaN));
|
||||
|
||||
// pow( inf, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(inf, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(inf, zero));
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(inf, neg_zero));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::pow(inf, 1.0));
|
||||
@@ -114,6 +148,8 @@ TEST_F(LlvmLibcPowTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::pow(inf, aNaN));
|
||||
|
||||
// pow( -inf, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(neg_inf, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(neg_inf, zero));
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(neg_inf, neg_zero));
|
||||
EXPECT_FP_EQ(neg_inf, LIBC_NAMESPACE::pow(neg_inf, 1.0));
|
||||
@@ -130,6 +166,8 @@ TEST_F(LlvmLibcPowTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::pow(neg_inf, aNaN));
|
||||
|
||||
// pow ( aNaN, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::pow(aNaN, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(aNaN, zero));
|
||||
EXPECT_FP_EQ(1.0, LIBC_NAMESPACE::pow(aNaN, neg_zero));
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::pow(aNaN, 1.0));
|
||||
|
||||
@@ -32,7 +32,33 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
if (!__r.success)
|
||||
continue;
|
||||
|
||||
// pow( sNaN, exponent)
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(sNaN, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::powf(sNaN, neg_odd_integer), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::powf(sNaN, neg_even_integer), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::powf(sNaN, pos_odd_integer), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
aNaN, LIBC_NAMESPACE::powf(sNaN, pos_even_integer), FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(sNaN, one_half),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(sNaN, zero),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(sNaN, neg_zero),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(sNaN, inf),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(sNaN, neg_inf),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(sNaN, aNaN),
|
||||
FE_INVALID);
|
||||
|
||||
// pow( 0.0f, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(zero, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
inf, LIBC_NAMESPACE::powf(zero, neg_odd_integer), FE_DIVBYZERO);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
@@ -51,6 +77,8 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::powf(zero, aNaN));
|
||||
|
||||
// pow( -0.0f, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(neg_zero, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
neg_inf, LIBC_NAMESPACE::powf(neg_zero, neg_odd_integer), FE_DIVBYZERO);
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(
|
||||
@@ -69,6 +97,8 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::powf(neg_zero, aNaN));
|
||||
|
||||
// pow( 1.0f, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(1.0f, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(1.0f, zero));
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(1.0f, neg_zero));
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(1.0f, 1.0f));
|
||||
@@ -83,7 +113,9 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(1.0f, neg_inf));
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(1.0f, aNaN));
|
||||
|
||||
// pow( 1.0f, exponent )
|
||||
// pow( -1.0f, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(-1.0f, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(-1.0f, zero));
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(-1.0f, neg_zero));
|
||||
EXPECT_FP_EQ(-1.0f, LIBC_NAMESPACE::powf(-1.0f, 1.0f));
|
||||
@@ -101,6 +133,8 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::powf(-1.0f, aNaN));
|
||||
|
||||
// pow( inf, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(inf, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(inf, zero));
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(inf, neg_zero));
|
||||
EXPECT_FP_EQ(inf, LIBC_NAMESPACE::powf(inf, 1.0f));
|
||||
@@ -117,6 +151,8 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::powf(inf, aNaN));
|
||||
|
||||
// pow( -inf, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(neg_inf, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(neg_inf, zero));
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(neg_inf, neg_zero));
|
||||
EXPECT_FP_EQ(neg_inf, LIBC_NAMESPACE::powf(neg_inf, 1.0f));
|
||||
@@ -133,6 +169,8 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::powf(neg_inf, aNaN));
|
||||
|
||||
// pow ( aNaN, exponent )
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(aNaN, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(aNaN, zero));
|
||||
EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::powf(aNaN, neg_zero));
|
||||
EXPECT_FP_IS_NAN(LIBC_NAMESPACE::powf(aNaN, 1.0f));
|
||||
@@ -160,6 +198,8 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ(zero, LIBC_NAMESPACE::powf(-1.1f, neg_inf));
|
||||
|
||||
// Exact powers of 2:
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(2.0f, sNaN),
|
||||
FE_INVALID);
|
||||
EXPECT_FP_EQ(0x1.0p15f, LIBC_NAMESPACE::powf(2.0f, 15.0f));
|
||||
EXPECT_FP_EQ(0x1.0p126f, LIBC_NAMESPACE::powf(2.0f, 126.0f));
|
||||
EXPECT_FP_EQ(0x1.0p-45f, LIBC_NAMESPACE::powf(2.0f, -45.0f));
|
||||
@@ -178,6 +218,8 @@ TEST_F(LlvmLibcPowfTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ(100000000.0f, LIBC_NAMESPACE::powf(10.0f, 8.0f));
|
||||
EXPECT_FP_EQ(1000000000.0f, LIBC_NAMESPACE::powf(10.0f, 9.0f));
|
||||
EXPECT_FP_EQ(10000000000.0f, LIBC_NAMESPACE::powf(10.0f, 10.0f));
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::powf(10.0f, sNaN),
|
||||
FE_INVALID);
|
||||
|
||||
// Overflow / Underflow:
|
||||
if (ROUNDING_MODES[i] != RoundingMode::Downward &&
|
||||
|
||||
@@ -15,6 +15,9 @@ using LlvmLibcSinTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
using LIBC_NAMESPACE::testing::tlog;
|
||||
|
||||
TEST_F(LlvmLibcSinTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::sin(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::sin(aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::sin(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::sin(neg_inf));
|
||||
|
||||
@@ -15,6 +15,11 @@ using LlvmLibcSincosTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
TEST_F(LlvmLibcSincosTest, SpecialNumbers) {
|
||||
double sin_x, cos_x;
|
||||
|
||||
LIBC_NAMESPACE::sincos(sNaN, &sin_x, &cos_x);
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, cos_x);
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, sin_x);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
LIBC_NAMESPACE::sincos(aNaN, &sin_x, &cos_x);
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, cos_x);
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, sin_x);
|
||||
|
||||
@@ -21,6 +21,11 @@ TEST_F(LlvmLibcSinCosfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
float sin, cos;
|
||||
|
||||
LIBC_NAMESPACE::sincosf(sNaN, &sin, &cos);
|
||||
EXPECT_FP_EQ(aNaN, cos);
|
||||
EXPECT_FP_EQ(aNaN, sin);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
LIBC_NAMESPACE::sincosf(aNaN, &sin, &cos);
|
||||
EXPECT_FP_EQ(aNaN, cos);
|
||||
EXPECT_FP_EQ(aNaN, sin);
|
||||
|
||||
@@ -16,6 +16,9 @@ using LlvmLibcSinf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
|
||||
TEST_F(LlvmLibcSinf16Test, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::sinf16(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinf16(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcSinfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcSinfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::sinf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -21,6 +21,9 @@ using LlvmLibcSinhfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcSinhfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::sinhf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinhf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@ using LlvmLibcSinpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
|
||||
TEST_F(LlvmLibcSinpif16Test, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::sinpif16(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinpif16(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@ using LlvmLibcSinpifTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcSinpifTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::sinpif(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::sinpif(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -15,6 +15,9 @@ using LlvmLibcTanTest = LIBC_NAMESPACE::testing::FPTest<double>;
|
||||
using LIBC_NAMESPACE::testing::tlog;
|
||||
|
||||
TEST_F(LlvmLibcTanTest, SpecialNumbers) {
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::tan(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::tan(aNaN));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::tan(inf));
|
||||
EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::tan(neg_inf));
|
||||
|
||||
@@ -17,6 +17,9 @@ using LlvmLibcTanf16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
|
||||
TEST_F(LlvmLibcTanf16Test, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::tanf16(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::tanf16(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcTanfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcTanfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::tanf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::tanf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ using LlvmLibcTanhfTest = LIBC_NAMESPACE::testing::FPTest<float>;
|
||||
TEST_F(LlvmLibcTanhfTest, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::tanhf(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::tanhf(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
@@ -16,6 +16,9 @@ using LlvmLibcTanpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
|
||||
TEST_F(LlvmLibcTanpif16Test, SpecialNumbers) {
|
||||
LIBC_NAMESPACE::libc_errno = 0;
|
||||
|
||||
EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::tanpif16(sNaN), FE_INVALID);
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::tanpif16(aNaN));
|
||||
EXPECT_MATH_ERRNO(0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user