1*e581841eSTue Ly //===-- Unittests for log10f ----------------------------------------------===//
2*e581841eSTue Ly //
3*e581841eSTue Ly // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e581841eSTue Ly // See https://llvm.org/LICENSE.txt for license information.
5*e581841eSTue Ly // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e581841eSTue Ly //
7*e581841eSTue Ly //===----------------------------------------------------------------------===//
8*e581841eSTue Ly
9*e581841eSTue Ly #include "src/__support/FPUtil/FPBits.h"
10*e581841eSTue Ly #include "src/math/log10f.h"
11*e581841eSTue Ly #include "utils/MPFRWrapper/MPFRUtils.h"
12*e581841eSTue Ly #include "utils/UnitTest/FPMatcher.h"
13*e581841eSTue Ly #include "utils/UnitTest/Test.h"
14*e581841eSTue Ly #include <math.h>
15*e581841eSTue Ly
16*e581841eSTue Ly #include <errno.h>
17*e581841eSTue Ly #include <stdint.h>
18*e581841eSTue Ly
19*e581841eSTue Ly namespace mpfr = __llvm_libc::testing::mpfr;
20*e581841eSTue Ly
21*e581841eSTue Ly DECLARE_SPECIAL_CONSTANTS(float)
22*e581841eSTue Ly
TEST(LlvmLibcLog10fTest,SpecialNumbers)23*e581841eSTue Ly TEST(LlvmLibcLog10fTest, SpecialNumbers) {
24*e581841eSTue Ly EXPECT_FP_EQ(aNaN, __llvm_libc::log10f(aNaN));
25*e581841eSTue Ly EXPECT_FP_EQ(inf, __llvm_libc::log10f(inf));
26*e581841eSTue Ly EXPECT_TRUE(FPBits(__llvm_libc::log10f(neg_inf)).is_nan());
27*e581841eSTue Ly EXPECT_FP_EQ(neg_inf, __llvm_libc::log10f(0.0f));
28*e581841eSTue Ly EXPECT_FP_EQ(neg_inf, __llvm_libc::log10f(-0.0f));
29*e581841eSTue Ly EXPECT_TRUE(FPBits(__llvm_libc::log10f(-1.0f)).is_nan());
30*e581841eSTue Ly EXPECT_FP_EQ(zero, __llvm_libc::log10f(1.0f));
31*e581841eSTue Ly }
32*e581841eSTue Ly
TEST(LlvmLibcLog10fTest,TrickyInputs)33*e581841eSTue Ly TEST(LlvmLibcLog10fTest, TrickyInputs) {
34*e581841eSTue Ly constexpr int N = 12;
35*e581841eSTue Ly constexpr uint32_t INPUTS[N] = {
36*e581841eSTue Ly 0x41200000U /*10.0f*/,
37*e581841eSTue Ly 0x42c80000U /*100.0f*/,
38*e581841eSTue Ly 0x447a0000U /*1,000.0f*/,
39*e581841eSTue Ly 0x461c4000U /*10,000.0f*/,
40*e581841eSTue Ly 0x47c35000U /*100,000.0f*/,
41*e581841eSTue Ly 0x49742400U /*1,000,000.0f*/,
42*e581841eSTue Ly 0x4b189680U /*10,000,000.0f*/,
43*e581841eSTue Ly 0x4cbebc20U /*100,000,000.0f*/,
44*e581841eSTue Ly 0x4e6e6b28U /*1,000,000,000.0f*/,
45*e581841eSTue Ly 0x501502f9U /*10,000,000,000.0f*/,
46*e581841eSTue Ly 0x4f134f83U /*2471461632.0f*/,
47*e581841eSTue Ly 0x7956ba5eU /*69683218960000541503257137270226944.0f*/};
48*e581841eSTue Ly
49*e581841eSTue Ly for (int i = 0; i < N; ++i) {
50*e581841eSTue Ly float x = float(FPBits(INPUTS[i]));
51*e581841eSTue Ly EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log10, x,
52*e581841eSTue Ly __llvm_libc::log10f(x), 0.5);
53*e581841eSTue Ly }
54*e581841eSTue Ly }
55*e581841eSTue Ly
TEST(LlvmLibcLog10fTest,InFloatRange)56*e581841eSTue Ly TEST(LlvmLibcLog10fTest, InFloatRange) {
57*e581841eSTue Ly constexpr uint32_t COUNT = 1000000;
58*e581841eSTue Ly constexpr uint32_t STEP = UINT32_MAX / COUNT;
59*e581841eSTue Ly for (uint32_t i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
60*e581841eSTue Ly float x = float(FPBits(v));
61*e581841eSTue Ly if (isnan(x) || isinf(x))
62*e581841eSTue Ly continue;
63*e581841eSTue Ly errno = 0;
64*e581841eSTue Ly float result = __llvm_libc::log10f(x);
65*e581841eSTue Ly // If the computation resulted in an error or did not produce valid result
66*e581841eSTue Ly // in the single-precision floating point range, then ignore comparing with
67*e581841eSTue Ly // MPFR result as MPFR can still produce valid results because of its
68*e581841eSTue Ly // wider precision.
69*e581841eSTue Ly if (isnan(result) || isinf(result) || errno != 0)
70*e581841eSTue Ly continue;
71*e581841eSTue Ly ASSERT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log10, x,
72*e581841eSTue Ly __llvm_libc::log10f(x), 0.5);
73*e581841eSTue Ly }
74*e581841eSTue Ly }
75