brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · fb99080 Raw
101 lines · cpp
1//===-- Unittests for logf-----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "hdr/math_macros.h"10#include "hdr/stdint_proxy.h"11#include "src/__support/FPUtil/FPBits.h"12#include "src/__support/macros/optimization.h"13#include "src/math/logf.h"14#include "test/UnitTest/FPMatcher.h"15#include "test/UnitTest/Test.h"16#include "utils/MPFRWrapper/MPFRUtils.h"17 18#ifdef LIBC_MATH_HAS_SKIP_ACCURATE_PASS19#define TOLERANCE 120#else21#define TOLERANCE 022#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS23 24using LlvmLibcLogfTest = LIBC_NAMESPACE::testing::FPTest<float>;25 26namespace mpfr = LIBC_NAMESPACE::testing::mpfr;27 28TEST_F(LlvmLibcLogfTest, SpecialNumbers) {29  EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::logf(aNaN));30  EXPECT_FP_EQ(inf, LIBC_NAMESPACE::logf(inf));31  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::logf(neg_inf), FE_INVALID);32  EXPECT_FP_EQ_WITH_EXCEPTION(neg_inf, LIBC_NAMESPACE::logf(0.0f),33                              FE_DIVBYZERO);34  EXPECT_FP_EQ_WITH_EXCEPTION(neg_inf, LIBC_NAMESPACE::logf(-0.0f),35                              FE_DIVBYZERO);36  EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::logf(-1.0f), FE_INVALID);37#ifdef LIBC_MATH_HAS_SKIP_ACCURATE_PASS38  EXPECT_TRUE(0.0f == LIBC_NAMESPACE::logf(1.0f));39#else40  EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::logf(1.0f));41#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS42}43 44TEST_F(LlvmLibcLogfTest, TrickyInputs) {45  constexpr int N = 35;46  constexpr uint32_t INPUTS[N] = {47      0x1b7679ffU, /*0x1.ecf3fep-73f*/48      0x1e88452dU, /*0x1.108a5ap-66f*/49      0x3f800001U, /*0x1.000002p+0f*/50      0x3509dcf6U, /*0x1.13b9ecp-21f*/51      0x3bf86ef0U, /*0x1.f0ddep-8f*/52      0x3c413d3aU, /*0x1.827a74p-7f*/53      0x3ca1c99fU, /*0x1.43933ep-6f*/54      0x3d13e105U, /*0x1.27c20ap-5f*/55      0x3f7ff1f2U, /*0x1.ffe3e4p-1f*/56      0x3f7fffffU, /*0x1.fffffep-1f*/57      0x3f800001U, /*0x1.000002p+0f*/58      0x3f800006U, /*0x1.00000cp+0f*/59      0x3f800014U, /*0x1.000028p+0f*/60      0x3f80001cU, /*0x1.000038p+0f*/61      0x3f80c777U, /*0x1.018eeep+0f*/62      0x3f80ce72U, /*0x1.019ce4p+0f*/63      0x3f80d19fU, /*0x1.01a33ep+0f*/64      0x3f80f7bfU, /*0x1.01ef7ep+0f*/65      0x3f80fcfeU, /*0x1.01f9fcp+0f*/66      0x3f81feb4U, /*0x1.03fd68p+0f*/67      0x3f83d731U, /*0x1.07ae62p+0f*/68      0x3f90cb1dU, /*0x1.21963ap+0f*/69      0x3fc55379U, /*0x1.8aa6f2p+0f*/70      0x3fd364d7U, /*0x1.a6c9aep+0f*/71      0x41178febU, /*0x1.2f1fd6p+3f*/72      0x4c5d65a5U, /*0x1.bacb4ap+25f*/73      0x4e85f412U, /*0x1.0be824p+30f*/74      0x500ffb03U, /*0x1.1ff606p+33f*/75      0x5cd69e88U, /*0x1.ad3d1p+58f*/76      0x5ee8984eU, /*0x1.d1309cp+62f*/77      0x65d890d3U, /*0x1.b121a6p+76f*/78      0x665e7ca6U, /*0x1.bcf94cp+77f*/79      0x6f31a8ecU, /*0x1.6351d8p+95f*/80      0x79e7ec37U, /*0x1.cfd86ep+116f*/81      0x7a17f30aU, /*0x1.2fe614p+117f*/82  };83  for (int i = 0; i < N; ++i) {84    float x = FPBits(INPUTS[i]).get_val();85    EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log, x,86                                   LIBC_NAMESPACE::logf(x), TOLERANCE + 0.5);87  }88}89 90TEST_F(LlvmLibcLogfTest, InFloatRange) {91  constexpr uint32_t COUNT = 100'000;92  constexpr uint32_t STEP = UINT32_MAX / COUNT;93  for (uint32_t i = 0, v = 0; i <= COUNT; ++i, v += STEP) {94    float x = FPBits(v).get_val();95    if (FPBits(v).is_nan() || FPBits(v).is_inf())96      continue;97    ASSERT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log, x,98                                   LIBC_NAMESPACE::logf(x), 0.5);99  }100}101