xref: /llvm-project/libc/test/src/math/logf_test.cpp (revision f8f5b17564cb839101ba99390bcecc564de57e65)
1d08a801bSTue Ly //===-- Unittests for logf-----------------------------------------------===//
2d08a801bSTue Ly //
3d08a801bSTue Ly // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d08a801bSTue Ly // See https://llvm.org/LICENSE.txt for license information.
5d08a801bSTue Ly // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d08a801bSTue Ly //
7d08a801bSTue Ly //===----------------------------------------------------------------------===//
8d08a801bSTue Ly 
95748ad84Slntue #include "hdr/math_macros.h"
10d08a801bSTue Ly #include "src/__support/FPUtil/FPBits.h"
11d08a801bSTue Ly #include "src/math/logf.h"
12af1315c2SSiva Chandra Reddy #include "test/UnitTest/FPMatcher.h"
13af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
14d08a801bSTue Ly #include "utils/MPFRWrapper/MPFRUtils.h"
15d08a801bSTue Ly 
16d08a801bSTue Ly #include <stdint.h>
17d08a801bSTue Ly 
183fd5113cSlntue using LlvmLibcLogfTest = LIBC_NAMESPACE::testing::FPTest<float>;
193fd5113cSlntue 
20b6bc9d72SGuillaume Chatelet namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
21d08a801bSTue Ly 
223fd5113cSlntue TEST_F(LlvmLibcLogfTest, SpecialNumbers) {
23b6bc9d72SGuillaume Chatelet   EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::logf(aNaN));
24b6bc9d72SGuillaume Chatelet   EXPECT_FP_EQ(inf, LIBC_NAMESPACE::logf(inf));
25b6bc9d72SGuillaume Chatelet   EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::logf(neg_inf), FE_INVALID);
26b6bc9d72SGuillaume Chatelet   EXPECT_FP_EQ_WITH_EXCEPTION(neg_inf, LIBC_NAMESPACE::logf(0.0f),
27b6bc9d72SGuillaume Chatelet                               FE_DIVBYZERO);
28b6bc9d72SGuillaume Chatelet   EXPECT_FP_EQ_WITH_EXCEPTION(neg_inf, LIBC_NAMESPACE::logf(-0.0f),
29b6bc9d72SGuillaume Chatelet                               FE_DIVBYZERO);
30b6bc9d72SGuillaume Chatelet   EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::logf(-1.0f), FE_INVALID);
31b6bc9d72SGuillaume Chatelet   EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::logf(1.0f));
32d08a801bSTue Ly }
33d08a801bSTue Ly 
343fd5113cSlntue TEST_F(LlvmLibcLogfTest, TrickyInputs) {
35ae2d8b49STue Ly   constexpr int N = 35;
36d08a801bSTue Ly   constexpr uint32_t INPUTS[N] = {
37ae2d8b49STue Ly       0x1b7679ffU, /*0x1.ecf3fep-73f*/
38ae2d8b49STue Ly       0x1e88452dU, /*0x1.108a5ap-66f*/
39ae2d8b49STue Ly       0x3f800001U, /*0x1.000002p+0f*/
4082df72ccSTue Ly       0x3509dcf6U, /*0x1.13b9ecp-21f*/
4182df72ccSTue Ly       0x3bf86ef0U, /*0x1.f0ddep-8f*/
42ae2d8b49STue Ly       0x3c413d3aU, /*0x1.827a74p-7f*/
4382df72ccSTue Ly       0x3ca1c99fU, /*0x1.43933ep-6f*/
4482df72ccSTue Ly       0x3d13e105U, /*0x1.27c20ap-5f*/
4582df72ccSTue Ly       0x3f7ff1f2U, /*0x1.ffe3e4p-1f*/
4682df72ccSTue Ly       0x3f7fffffU, /*0x1.fffffep-1f*/
4782df72ccSTue Ly       0x3f800001U, /*0x1.000002p+0f*/
4882df72ccSTue Ly       0x3f800006U, /*0x1.00000cp+0f*/
4982df72ccSTue Ly       0x3f800014U, /*0x1.000028p+0f*/
5082df72ccSTue Ly       0x3f80001cU, /*0x1.000038p+0f*/
5182df72ccSTue Ly       0x3f80c777U, /*0x1.018eeep+0f*/
5282df72ccSTue Ly       0x3f80ce72U, /*0x1.019ce4p+0f*/
5382df72ccSTue Ly       0x3f80d19fU, /*0x1.01a33ep+0f*/
5482df72ccSTue Ly       0x3f80f7bfU, /*0x1.01ef7ep+0f*/
5582df72ccSTue Ly       0x3f80fcfeU, /*0x1.01f9fcp+0f*/
5682df72ccSTue Ly       0x3f81feb4U, /*0x1.03fd68p+0f*/
5782df72ccSTue Ly       0x3f83d731U, /*0x1.07ae62p+0f*/
5882df72ccSTue Ly       0x3f90cb1dU, /*0x1.21963ap+0f*/
5982df72ccSTue Ly       0x3fc55379U, /*0x1.8aa6f2p+0f*/
6082df72ccSTue Ly       0x3fd364d7U, /*0x1.a6c9aep+0f*/
6182df72ccSTue Ly       0x41178febU, /*0x1.2f1fd6p+3f*/
6282df72ccSTue Ly       0x4c5d65a5U, /*0x1.bacb4ap+25f*/
6382df72ccSTue Ly       0x4e85f412U, /*0x1.0be824p+30f*/
6482df72ccSTue Ly       0x500ffb03U, /*0x1.1ff606p+33f*/
6582df72ccSTue Ly       0x5cd69e88U, /*0x1.ad3d1p+58f*/
66ae2d8b49STue Ly       0x5ee8984eU, /*0x1.d1309cp+62f*/
6782df72ccSTue Ly       0x65d890d3U, /*0x1.b121a6p+76f*/
68ae2d8b49STue Ly       0x665e7ca6U, /*0x1.bcf94cp+77f*/
6982df72ccSTue Ly       0x6f31a8ecU, /*0x1.6351d8p+95f*/
70ae2d8b49STue Ly       0x79e7ec37U, /*0x1.cfd86ep+116f*/
7182df72ccSTue Ly       0x7a17f30aU, /*0x1.2fe614p+117f*/
7282df72ccSTue Ly   };
73d08a801bSTue Ly   for (int i = 0; i < N; ++i) {
742856db0dSGuillaume Chatelet     float x = FPBits(INPUTS[i]).get_val();
75ae2d8b49STue Ly     EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log, x,
76b6bc9d72SGuillaume Chatelet                                    LIBC_NAMESPACE::logf(x), 0.5);
77d08a801bSTue Ly   }
78d08a801bSTue Ly }
79d08a801bSTue Ly 
803fd5113cSlntue TEST_F(LlvmLibcLogfTest, InFloatRange) {
81ae5c4724SGuillaume Chatelet   constexpr uint32_t COUNT = 100'000;
8225226f3eSMichael Jones   constexpr uint32_t STEP = UINT32_MAX / COUNT;
8325226f3eSMichael Jones   for (uint32_t i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
842856db0dSGuillaume Chatelet     float x = FPBits(v).get_val();
85*f8f5b175SNhat Nguyen     if (FPBits(v).is_nan() || FPBits(v).is_inf())
86d08a801bSTue Ly       continue;
87ae2d8b49STue Ly     ASSERT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log, x,
88b6bc9d72SGuillaume Chatelet                                    LIBC_NAMESPACE::logf(x), 0.5);
89d08a801bSTue Ly   }
90d08a801bSTue Ly }
91