| //===-- Unittests for atanpif16 -------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "src/math/atanpif16.h" |
| #include "test/UnitTest/FPMatcher.h" |
| |
| using LIBC_NAMESPACE::cpp::array; |
| using LlvmLibcAtanpif16Test = LIBC_NAMESPACE::testing::FPTest<float16>; |
| |
| TEST_F(LlvmLibcAtanpif16Test, SpecialNumbers) { |
| // zero |
| EXPECT_FP_EQ(zero, LIBC_NAMESPACE::atanpif16(zero)); |
| EXPECT_FP_EQ(neg_zero, LIBC_NAMESPACE::atanpif16(neg_zero)); |
| |
| // NaN inputs |
| EXPECT_FP_EQ(FPBits::quiet_nan().get_val(), |
| LIBC_NAMESPACE::atanpif16(FPBits::quiet_nan().get_val())); |
| |
| EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::atanpif16(aNaN)); |
| |
| // infinity inputs -> should return +/-0.5 |
| EXPECT_FP_EQ(0.5f16, LIBC_NAMESPACE::atanpif16(inf)); |
| EXPECT_FP_EQ(-0.5f16, LIBC_NAMESPACE::atanpif16(neg_inf)); |
| } |
| |
| TEST_F(LlvmLibcAtanpif16Test, SymmetryProperty) { |
| // Test that atanpi(-x) = -atanpi(x) |
| constexpr array<float16, 12> TEST_VALS = { |
| 0.1f16, 0.25f16, 0.5f16, 0.75f16, 1.0f16, 1.5f16, |
| 2.0f16, 5.0f16, 10.0f16, 50.0f16, 100.0f16, 1000.0f16}; |
| |
| for (float16 x : TEST_VALS) { |
| FPBits neg_x_bits(x); |
| neg_x_bits.set_sign(Sign::NEG); |
| float16 neg_x = neg_x_bits.get_val(); |
| |
| float16 pos_result = LIBC_NAMESPACE::atanpif16(x); |
| float16 neg_result = LIBC_NAMESPACE::atanpif16(neg_x); |
| |
| EXPECT_FP_EQ(pos_result, FPBits(neg_result).abs().get_val()); |
| } |
| } |
| |
| TEST_F(LlvmLibcAtanpif16Test, MonotonicityProperty) { |
| // Test that atanpi is monotonically increasing |
| constexpr array<float16, 15> TEST_VALS = { |
| -1000.0f16, -100.0f16, -10.0f16, -2.0f16, -1.0f16, |
| -0.5f16, -0.1f16, 0.0f16, 0.1f16, 0.5f16, |
| 1.0f16, 2.0f16, 10.0f16, 100.0f16, 1000.0f16}; |
| for (size_t i = 0; i < TEST_VALS.size() - 1; ++i) { |
| float16 x1 = TEST_VALS[i]; |
| float16 x2 = TEST_VALS[i + 1]; |
| float16 result1 = LIBC_NAMESPACE::atanpif16(x1); |
| float16 result2 = LIBC_NAMESPACE::atanpif16(x2); |
| |
| EXPECT_TRUE(result1 < result2); |
| } |
| } |