brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 695a2fb Raw
65 lines · cpp
1//===-- Exhaustive test for hypotf ----------------------------------------===//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 "exhaustive_test.h"10#include "src/__support/FPUtil/FPBits.h"11#include "src/__support/FPUtil/Hypot.h"12#include "src/math/hypotf.h"13#include "test/UnitTest/FPMatcher.h"14#include "utils/MPFRWrapper/MPFRUtils.h"15 16namespace mpfr = LIBC_NAMESPACE::testing::mpfr;17 18struct HypotfChecker : public virtual LIBC_NAMESPACE::testing::Test {19  using FloatType = float;20  using FPBits = LIBC_NAMESPACE::fputil::FPBits<float>;21  using StorageType = typename FPBits::StorageType;22 23  uint64_t check(uint32_t start, uint32_t stop, mpfr::RoundingMode rounding) {24    // Range of the second input: [2^37, 2^48].25    constexpr uint32_t Y_START = (37U + 127U) << 23;26    constexpr uint32_t Y_STOP = (48U + 127U) << 23;27 28    mpfr::ForceRoundingMode r(rounding);29    if (!r.success)30      return true;31    uint32_t xbits = start;32    uint64_t failed = 0;33    do {34      float x = FPBits(xbits).get_val();35      uint32_t ybits = Y_START;36      do {37        float y = FPBits(ybits).get_val();38        bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y),39                                  LIBC_NAMESPACE::hypotf(x, y));40        // Using MPFR will be much slower.41        // mpfr::BinaryInput<float> input{x, y};42        // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY(43        //     mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf(x, y), 0.5,44        //     rounding);45        failed += (!correct);46      } while (ybits++ < Y_STOP);47    } while (xbits++ < stop);48    return failed;49  }50};51 52using LlvmLibcHypotfExhaustiveTest =53    LlvmLibcExhaustiveMathTest<HypotfChecker, /*Increment=*/1>;54 55// Range of the first input: [2^23, 2^24];56static constexpr uint32_t START = (23U + 127U) << 23;57// static constexpr uint32_t STOP = (24U + 127U) << 23;58// Use a smaller range for automated tests, since the full range takes too long59// and should only be run manually.60static constexpr uint32_t STOP = ((23U + 127U) << 23) + 1024U;61 62TEST_F(LlvmLibcHypotfExhaustiveTest, PositiveRange) {63  test_full_range_all_roundings(START, STOP);64}65