From 08792d33933092bf25c1c059fe2fd402030ca5c5 Mon Sep 17 00:00:00 2001 From: meltq Date: Wed, 19 Mar 2025 15:19:37 +0530 Subject: [PATCH 01/21] Add hypotf16() function --- libc/config/linux/x86_64/entrypoints.txt | 1 + libc/docs/headers/math/index.rst | 2 +- libc/include/math.yaml | 8 ++ libc/src/math/CMakeLists.txt | 1 + libc/src/math/generic/CMakeLists.txt | 15 ++++ libc/src/math/generic/hypotf16.cpp | 86 +++++++++++++++++++ libc/src/math/hypotf16.h | 21 +++++ libc/test/src/math/CMakeLists.txt | 12 +++ libc/test/src/math/exhaustive/CMakeLists.txt | 18 ++++ .../src/math/exhaustive/hypotf16_test.cpp | 56 ++++++++++++ libc/test/src/math/hypotf16_test.cpp | 27 ++++++ libc/test/src/math/smoke/CMakeLists.txt | 14 +++ libc/test/src/math/smoke/hypotf16_test.cpp | 33 +++++++ 13 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 libc/src/math/generic/hypotf16.cpp create mode 100644 libc/src/math/hypotf16.h create mode 100644 libc/test/src/math/exhaustive/hypotf16_test.cpp create mode 100644 libc/test/src/math/hypotf16_test.cpp create mode 100644 libc/test/src/math/smoke/hypotf16_test.cpp diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt index a29478898fe70..f2a936962dd6d 100644 --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -701,6 +701,7 @@ if(LIBC_TYPES_HAS_FLOAT16) libc.src.math.fromfpf16 libc.src.math.fromfpxf16 libc.src.math.getpayloadf16 + libc.src.math.hypotf16 libc.src.math.ilogbf16 libc.src.math.iscanonicalf16 libc.src.math.issignalingf16 diff --git a/libc/docs/headers/math/index.rst b/libc/docs/headers/math/index.rst index 5b855ce4881c3..ff7fd32690b3c 100644 --- a/libc/docs/headers/math/index.rst +++ b/libc/docs/headers/math/index.rst @@ -305,7 +305,7 @@ Higher Math Functions +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | fsqrt | N/A | |check| | |check| | N/A | |check|\* | 7.12.14.6 | F.10.11 | +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ -| hypot | |check| | |check| | | | | 7.12.7.4 | F.10.4.4 | +| hypot | |check| | |check| | | |check| | | 7.12.7.4 | F.10.4.4 | +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ | lgamma | | | | | | 7.12.8.3 | F.10.5.3 | +-----------+------------------+-----------------+------------------------+----------------------+------------------------+------------------------+----------------------------+ diff --git a/libc/include/math.yaml b/libc/include/math.yaml index a66f981030864..b0bb5d74c5605 100644 --- a/libc/include/math.yaml +++ b/libc/include/math.yaml @@ -1366,6 +1366,14 @@ functions: arguments: - type: float - type: float + - name: hypotf16 + standards: + - stdc + return_type: _Float16 + arguments: + - type: _Float16 + - type: _Float16 + guard: LIBC_TYPES_HAS_FLOAT16 - name: ilogb standards: - stdc diff --git a/libc/src/math/CMakeLists.txt b/libc/src/math/CMakeLists.txt index f18a73d46f9aa..3a098951bb205 100644 --- a/libc/src/math/CMakeLists.txt +++ b/libc/src/math/CMakeLists.txt @@ -310,6 +310,7 @@ add_math_entrypoint_object(getpayloadf128) add_math_entrypoint_object(hypot) add_math_entrypoint_object(hypotf) +add_math_entrypoint_object(hypotf16) add_math_entrypoint_object(ilogb) add_math_entrypoint_object(ilogbf) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 3114289bad486..7ec2e0bf9e865 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -3105,6 +3105,21 @@ add_entrypoint_object( libc.src.__support.macros.optimization ) +add_entrypoint_object( + hypotf16 + SRCS + hypotf16.cpp + HDRS + ../hypotf16.h + DEPENDS + libc.src.__support.FPUtil.fenv_impl + libc.src.__support.FPUtil.fp_bits + libc.src.__support.FPUtil.multiply_add + libc.src.__support.FPUtil.sqrt + libc.src.__support.macros.optimization + libc.src.__support.macros.properties.types +) + add_entrypoint_object( fdim SRCS diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp new file mode 100644 index 0000000000000..c827c0d8a513f --- /dev/null +++ b/libc/src/math/generic/hypotf16.cpp @@ -0,0 +1,86 @@ +//===-- Implementation of hypotf function ---------------------------------===// +// +// 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/hypotf16.h" +#include "src/__support/FPUtil/FEnvImpl.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/multiply_add.h" +#include "src/__support/FPUtil/sqrt.h" +#include "src/__support/common.h" +#include "src/__support/macros/properties/types.h" +#include "src/__support/macros/optimization.h" +#include "src/__support/FPUtil/cast.h" + +namespace LIBC_NAMESPACE_DECL { + +LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { + using FloatBits = fputil::FPBits; + using FPBits = fputil::FPBits; + + FPBits x_abs = FPBits(x).abs(); + FPBits y_abs = FPBits(y).abs(); + + bool x_abs_larger = x_abs.uintval() >= y_abs.uintval(); + + FPBits a_bits = x_abs_larger ? x_abs : y_abs; + FPBits b_bits = x_abs_larger ? y_abs : x_abs; + + uint16_t a_u = a_bits.uintval(); + uint16_t b_u = b_bits.uintval(); + + // Note: replacing `a_u >= FPBits::EXP_MASK` with `a_bits.is_inf_or_nan()` + // generates extra exponent bit masking instructions on x86-64. + if (LIBC_UNLIKELY(a_u >= FPBits::EXP_MASK)) { + // x or y is inf or nan + if (a_bits.is_signaling_nan() || b_bits.is_signaling_nan()) { + fputil::raise_except_if_required(FE_INVALID); + return FPBits::quiet_nan().get_val(); + } + if (a_bits.is_inf() || b_bits.is_inf()) + return FPBits::inf().get_val(); + return a_bits.get_val(); + } + + if (LIBC_UNLIKELY(a_u - b_u >= + static_cast((FPBits::FRACTION_LEN + 2) + << FPBits::FRACTION_LEN))) + return x_abs.get_val() + y_abs.get_val(); + + float ad = fputil::cast(a_bits.get_val()); + float bd = fputil::cast(b_bits.get_val()); + + // These squares are exact. + float a_sq = ad * ad; + float sum_sq = fputil::multiply_add(bd, bd, a_sq); + + FloatBits result(fputil::sqrt(sum_sq)); + uint32_t r_u = result.uintval(); + + // If any of the sticky bits of the result are non-zero, except the LSB, then + // the rounded result is correct. + if (LIBC_UNLIKELY(((r_u + 1) & 0x0000'0FFE) == 0)) { + float r_d = result.get_val(); + + // Perform rounding correction. + float sum_sq_lo = fputil::multiply_add(bd, bd, a_sq - sum_sq); + float err = sum_sq_lo - fputil::multiply_add(r_d, r_d, -sum_sq); + + if (err > 0) { + r_u |= 1; + } else if ((err < 0) && (r_u & 1) == 0) { + r_u -= 1; + } else if ((r_u & 0x0000'1FFF) == 0) { + // The rounded result is exact. + fputil::clear_except_if_required(FE_INEXACT); + } + return fputil::cast(FloatBits(r_u).get_val()); + } + + return fputil::cast(result.get_val()); +} +} diff --git a/libc/src/math/hypotf16.h b/libc/src/math/hypotf16.h new file mode 100644 index 0000000000000..2d37c61b4ee7b --- /dev/null +++ b/libc/src/math/hypotf16.h @@ -0,0 +1,21 @@ +//===-- Implementation header for hypotf16 ----------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_MATH_HYPOTF16_H +#define LLVM_LIBC_SRC_MATH_HYPOTF16_H + +#include "src/__support/macros/config.h" +#include "src/__support/macros/properties/types.h" + +namespace LIBC_NAMESPACE_DECL { + +float16 hypotf16(float16 x, float16 y); + +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC_MATH_HYPOTF16_H diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt index 53ddd301900c0..79ae9377afd28 100644 --- a/libc/test/src/math/CMakeLists.txt +++ b/libc/test/src/math/CMakeLists.txt @@ -1701,6 +1701,18 @@ add_fp_unittest( libc.src.__support.FPUtil.fp_bits ) +add_fp_unittest( + hypotf16_test + NEED_MPFR + SUITE + libc-math-unittests + SRCS + hypotf16_test.cpp + DEPENDS + libc.src.math.hypotf16 + libc.src.__support.FPUtil.fp_bits +) + add_fp_unittest( nextafter_test SUITE diff --git a/libc/test/src/math/exhaustive/CMakeLists.txt b/libc/test/src/math/exhaustive/CMakeLists.txt index b1927dbc19a3b..551f449c9c8db 100644 --- a/libc/test/src/math/exhaustive/CMakeLists.txt +++ b/libc/test/src/math/exhaustive/CMakeLists.txt @@ -314,6 +314,24 @@ add_fp_unittest( -lpthread ) +add_fp_unittest( + hypotf16_test + NO_RUN_POSTBUILD + NEED_MPFR + SUITE + libc_math_exhaustive_tests + SRCS + hypotf16_test.cpp + COMPILE_OPTIONS + ${libc_opt_high_flag} + DEPENDS + .exhaustive_test + libc.src.math.hypotf16 + libc.src.__support.FPUtil.fp_bits + LINK_LIBRARIES + -lpthread +) + add_fp_unittest( fmod_generic_impl_test NO_RUN_POSTBUILD diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp new file mode 100644 index 0000000000000..085504398deac --- /dev/null +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -0,0 +1,56 @@ +//===-- Exhaustive test for hypotf16 --------------------------------------===// +// +// 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 "exhaustive_test.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/Hypot.h" +#include "src/math/hypotf16.h" +#include "test/UnitTest/FPMatcher.h" +#include "utils/MPFRWrapper/MPFRUtils.h" + +namespace mpfr = LIBC_NAMESPACE::testing::mpfr; + +// Range of both inputs: [0, inf] +static constexpr uint16_t START = 0x0000U; +static constexpr uint16_t STOP = 0x7C00U; + +struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { + using FloatType = float16; + using FPBits = LIBC_NAMESPACE::fputil::FPBits; + using StorageType = typename FPBits::StorageType; + + uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) { + mpfr::ForceRoundingMode r(rounding); + if (!r.success) + return true; + uint16_t xbits = start; + uint64_t failed = 0; + do { + float16 x = FPBits(xbits).get_val(); + uint16_t ybits = xbits; + do { + float16 y = FPBits(ybits).get_val(); + bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y), + LIBC_NAMESPACE::hypotf16(x, y)); + // Using MPFR will be much slower. + // mpfr::BinaryInput input{x, y}; + // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY( + // mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y), 0.5, + // rounding); + failed += (!correct); + } while (ybits++ < STOP); + } while (xbits++ < stop); + return failed; + } +}; + +using LlvmLibcHypotf16ExhaustiveTest = LlvmLibcExhaustiveMathTest; + +TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { + test_full_range_all_roundings(START, STOP); +} diff --git a/libc/test/src/math/hypotf16_test.cpp b/libc/test/src/math/hypotf16_test.cpp new file mode 100644 index 0000000000000..28ac9683876a6 --- /dev/null +++ b/libc/test/src/math/hypotf16_test.cpp @@ -0,0 +1,27 @@ +//===-- Unittests for hypotf16 --------------------------------------------===// +// +// 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 "HypotTest.h" +#include "hypotf_hard_to_round.h" + +#include "src/math/hypotf16.h" + +using LlvmLibcHypotf16Test = HypotTestTemplate; + +// TEST_F(LlvmLibcHypotf16Test, SubnormalRange) { +// test_subnormal_range(&LIBC_NAMESPACE::hypotf16); +// } +// +// TEST_F(LlvmLibcHypotf16Test, NormalRange) { +// test_normal_range(&LIBC_NAMESPACE::hypotf16); +// } +// +// TEST_F(LlvmLibcHypotf16Test, TrickyInputs) { +// test_input_list(&LIBC_NAMESPACE::hypotf16, N_HARD_TO_ROUND, +// HYPOTF_HARD_TO_ROUND); +// } diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 6f94440d826d9..639fe9590ef39 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -3121,6 +3121,20 @@ add_fp_unittest( libc.src.__support.macros.properties.architectures ) +add_fp_unittest( + hypotf16_test + SUITE + libc-math-smoke-tests + SRCS + hypotf16_test.cpp + HDRS + HypotTest.h + DEPENDS + libc.src.math.hypotf16 + libc.src.__support.FPUtil.fp_bits + libc.src.__support.macros.properties.architectures +) + add_fp_unittest( hypot_test SUITE diff --git a/libc/test/src/math/smoke/hypotf16_test.cpp b/libc/test/src/math/smoke/hypotf16_test.cpp new file mode 100644 index 0000000000000..5e9d987b6dbd6 --- /dev/null +++ b/libc/test/src/math/smoke/hypotf16_test.cpp @@ -0,0 +1,33 @@ +//===-- Unittests for hypotf16 --------------------------------------------===// +// +// 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/errno/libc_errno.h" +#include "test/UnitTest/FPMatcher.h" +#include "test/UnitTest/Test.h" +#include "src/math/hypotf16.h" + +using LlvmLibcHypotf16Test = LIBC_NAMESPACE::testing::FPTest; + +TEST_F(LlvmLibcHypotf16Test, SpecialNumbers) { + LIBC_NAMESPACE::libc_errno = 0; + EXPECT_FP_EQ(inf, LIBC_NAMESPACE::hypotf16(inf, aNaN)); + EXPECT_MATH_ERRNO(0); + EXPECT_FP_EQ(inf, LIBC_NAMESPACE::hypotf16(aNaN, neg_inf)); + EXPECT_MATH_ERRNO(0); + EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::hypotf16(aNaN, aNaN)); + EXPECT_MATH_ERRNO(0); + EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::hypotf16(sNaN, zero)); + EXPECT_MATH_ERRNO(0); + EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::hypotf16(neg_zero, sNaN)); + EXPECT_MATH_ERRNO(0); + + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(inf, sNaN), FE_INVALID); + EXPECT_MATH_ERRNO(0); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(sNaN, neg_inf), FE_INVALID); + EXPECT_MATH_ERRNO(0); +} From 483ce41e5ae10f4757bcdb6a0cd14ae178dea160 Mon Sep 17 00:00:00 2001 From: meltq Date: Wed, 19 Mar 2025 15:22:34 +0530 Subject: [PATCH 02/21] Formatting changes --- libc/src/math/generic/hypotf16.cpp | 6 +++--- libc/test/src/math/exhaustive/hypotf16_test.cpp | 3 ++- libc/test/src/math/smoke/hypotf16_test.cpp | 8 +++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp index c827c0d8a513f..75323c5cf5aa8 100644 --- a/libc/src/math/generic/hypotf16.cpp +++ b/libc/src/math/generic/hypotf16.cpp @@ -9,12 +9,12 @@ #include "src/math/hypotf16.h" #include "src/__support/FPUtil/FEnvImpl.h" #include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/cast.h" #include "src/__support/FPUtil/multiply_add.h" #include "src/__support/FPUtil/sqrt.h" #include "src/__support/common.h" -#include "src/__support/macros/properties/types.h" #include "src/__support/macros/optimization.h" -#include "src/__support/FPUtil/cast.h" +#include "src/__support/macros/properties/types.h" namespace LIBC_NAMESPACE_DECL { @@ -83,4 +83,4 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { return fputil::cast(result.get_val()); } -} +} // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index 085504398deac..a13f2e4a1bd05 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -49,7 +49,8 @@ struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { } }; -using LlvmLibcHypotf16ExhaustiveTest = LlvmLibcExhaustiveMathTest; +using LlvmLibcHypotf16ExhaustiveTest = + LlvmLibcExhaustiveMathTest; TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { test_full_range_all_roundings(START, STOP); diff --git a/libc/test/src/math/smoke/hypotf16_test.cpp b/libc/test/src/math/smoke/hypotf16_test.cpp index 5e9d987b6dbd6..d56cdc457a134 100644 --- a/libc/test/src/math/smoke/hypotf16_test.cpp +++ b/libc/test/src/math/smoke/hypotf16_test.cpp @@ -7,9 +7,9 @@ //===----------------------------------------------------------------------===// #include "src/errno/libc_errno.h" +#include "src/math/hypotf16.h" #include "test/UnitTest/FPMatcher.h" #include "test/UnitTest/Test.h" -#include "src/math/hypotf16.h" using LlvmLibcHypotf16Test = LIBC_NAMESPACE::testing::FPTest; @@ -26,8 +26,10 @@ TEST_F(LlvmLibcHypotf16Test, SpecialNumbers) { EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::hypotf16(neg_zero, sNaN)); EXPECT_MATH_ERRNO(0); - EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(inf, sNaN), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(inf, sNaN), + FE_INVALID); EXPECT_MATH_ERRNO(0); - EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(sNaN, neg_inf), FE_INVALID); + EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(sNaN, neg_inf), + FE_INVALID); EXPECT_MATH_ERRNO(0); } From 67d93c8c1ae2232666839380983a5accb75f2bd0 Mon Sep 17 00:00:00 2001 From: meltq Date: Thu, 20 Mar 2025 11:15:17 +0530 Subject: [PATCH 03/21] Temp removed exhaustive --- .../src/math/exhaustive/hypotf16_test.cpp | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index a13f2e4a1bd05..c552ce973489c 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -6,52 +6,52 @@ // //===----------------------------------------------------------------------===// -#include "exhaustive_test.h" -#include "src/__support/FPUtil/FPBits.h" -#include "src/__support/FPUtil/Hypot.h" -#include "src/math/hypotf16.h" -#include "test/UnitTest/FPMatcher.h" -#include "utils/MPFRWrapper/MPFRUtils.h" - -namespace mpfr = LIBC_NAMESPACE::testing::mpfr; - -// Range of both inputs: [0, inf] -static constexpr uint16_t START = 0x0000U; -static constexpr uint16_t STOP = 0x7C00U; - -struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { - using FloatType = float16; - using FPBits = LIBC_NAMESPACE::fputil::FPBits; - using StorageType = typename FPBits::StorageType; - - uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) { - mpfr::ForceRoundingMode r(rounding); - if (!r.success) - return true; - uint16_t xbits = start; - uint64_t failed = 0; - do { - float16 x = FPBits(xbits).get_val(); - uint16_t ybits = xbits; - do { - float16 y = FPBits(ybits).get_val(); - bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y), - LIBC_NAMESPACE::hypotf16(x, y)); - // Using MPFR will be much slower. - // mpfr::BinaryInput input{x, y}; - // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY( - // mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y), 0.5, - // rounding); - failed += (!correct); - } while (ybits++ < STOP); - } while (xbits++ < stop); - return failed; - } -}; - -using LlvmLibcHypotf16ExhaustiveTest = - LlvmLibcExhaustiveMathTest; - -TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { - test_full_range_all_roundings(START, STOP); -} +// #include "exhaustive_test.h" +// #include "src/__support/FPUtil/FPBits.h" +// #include "src/__support/FPUtil/Hypot.h" +// #include "src/math/hypotf16.h" +// #include "test/UnitTest/FPMatcher.h" +// #include "utils/MPFRWrapper/MPFRUtils.h" +// +// namespace mpfr = LIBC_NAMESPACE::testing::mpfr; +// +// // Range of both inputs: [0, inf] +// static constexpr uint16_t START = 0x0000U; +// static constexpr uint16_t STOP = 0x7C00U; +// +// struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { +// using FloatType = float16; +// using FPBits = LIBC_NAMESPACE::fputil::FPBits; +// using StorageType = typename FPBits::StorageType; +// +// uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) { +// mpfr::ForceRoundingMode r(rounding); +// if (!r.success) +// return true; +// uint16_t xbits = start; +// uint64_t failed = 0; +// do { +// float16 x = FPBits(xbits).get_val(); +// uint16_t ybits = xbits; +// do { +// float16 y = FPBits(ybits).get_val(); +// bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y), +// LIBC_NAMESPACE::hypotf16(x, y)); +// // Using MPFR will be much slower. +// // mpfr::BinaryInput input{x, y}; +// // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY( +// // mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y), 0.5, +// // rounding); +// failed += (!correct); +// } while (ybits++ < STOP); +// } while (xbits++ < stop); +// return failed; +// } +// }; +// +// using LlvmLibcHypotf16ExhaustiveTest = +// LlvmLibcExhaustiveMathTest; +// +// TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { +// test_full_range_all_roundings(START, STOP); +// } From 3395a6f5609c4169e42e2875e6bb9e9a544d8ba0 Mon Sep 17 00:00:00 2001 From: meltq Date: Thu, 20 Mar 2025 11:19:22 +0530 Subject: [PATCH 04/21] Formatting changes --- libc/test/src/math/exhaustive/hypotf16_test.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index c552ce973489c..328c0da78f378 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -24,7 +24,8 @@ // using FPBits = LIBC_NAMESPACE::fputil::FPBits; // using StorageType = typename FPBits::StorageType; // -// uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) { +// uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) +// { // mpfr::ForceRoundingMode r(rounding); // if (!r.success) // return true; @@ -40,7 +41,8 @@ // // Using MPFR will be much slower. // // mpfr::BinaryInput input{x, y}; // // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY( -// // mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y), 0.5, +// // mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y), +// 0.5, // // rounding); // failed += (!correct); // } while (ybits++ < STOP); From 916c5ec90daede70087981e8b8ff700f67f45a21 Mon Sep 17 00:00:00 2001 From: meltq Date: Thu, 20 Mar 2025 15:19:01 +0530 Subject: [PATCH 05/21] Add normal and subnormal tests --- libc/test/src/math/hypotf16_test.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libc/test/src/math/hypotf16_test.cpp b/libc/test/src/math/hypotf16_test.cpp index 28ac9683876a6..82d18c38568c9 100644 --- a/libc/test/src/math/hypotf16_test.cpp +++ b/libc/test/src/math/hypotf16_test.cpp @@ -13,14 +13,14 @@ using LlvmLibcHypotf16Test = HypotTestTemplate; -// TEST_F(LlvmLibcHypotf16Test, SubnormalRange) { -// test_subnormal_range(&LIBC_NAMESPACE::hypotf16); -// } -// -// TEST_F(LlvmLibcHypotf16Test, NormalRange) { -// test_normal_range(&LIBC_NAMESPACE::hypotf16); -// } -// +TEST_F(LlvmLibcHypotf16Test, SubnormalRange) { + test_subnormal_range(&LIBC_NAMESPACE::hypotf16); +} + +TEST_F(LlvmLibcHypotf16Test, NormalRange) { + test_normal_range(&LIBC_NAMESPACE::hypotf16); +} + // TEST_F(LlvmLibcHypotf16Test, TrickyInputs) { // test_input_list(&LIBC_NAMESPACE::hypotf16, N_HARD_TO_ROUND, // HYPOTF_HARD_TO_ROUND); From 55d58c105cdedc1dcac62a9caa5d1d7c79b7c6ab Mon Sep 17 00:00:00 2001 From: meltq Date: Thu, 20 Mar 2025 19:09:46 +0530 Subject: [PATCH 06/21] Add 1 to round up STEP for subnormal --- libc/test/src/math/HypotTest.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libc/test/src/math/HypotTest.h b/libc/test/src/math/HypotTest.h index fd0c1b394b8f7..dc73581e67ff0 100644 --- a/libc/test/src/math/HypotTest.h +++ b/libc/test/src/math/HypotTest.h @@ -73,7 +73,7 @@ class HypotTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest { constexpr StorageType COUNT = 10'001; for (unsigned scale = 0; scale < 4; ++scale) { StorageType max_value = MAX_SUBNORMAL << scale; - StorageType step = (max_value - MIN_SUBNORMAL) / COUNT; + StorageType step = (max_value - MIN_SUBNORMAL) / COUNT + 1; for (int signs = 0; signs < 4; ++signs) { for (StorageType v = MIN_SUBNORMAL, w = max_value; v <= max_value && w >= MIN_SUBNORMAL; v += step, w -= step) { From c6970d671c0efe52268d36fec9a9c94ff5cac2f9 Mon Sep 17 00:00:00 2001 From: meltq Date: Sun, 23 Mar 2025 22:46:34 +0530 Subject: [PATCH 07/21] Added hard to round, formatting --- .../src/math/exhaustive/hypotf16_test.cpp | 102 +- libc/test/src/math/hypotf16_hard_to_round.h | 1022 +++++++++++++++++ libc/test/src/math/hypotf16_test.cpp | 10 +- libc/test/src/math/smoke/hypotf16_test.cpp | 26 +- 4 files changed, 1082 insertions(+), 78 deletions(-) create mode 100644 libc/test/src/math/hypotf16_hard_to_round.h diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index 328c0da78f378..4defb11d02ee6 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -6,54 +6,54 @@ // //===----------------------------------------------------------------------===// -// #include "exhaustive_test.h" -// #include "src/__support/FPUtil/FPBits.h" -// #include "src/__support/FPUtil/Hypot.h" -// #include "src/math/hypotf16.h" -// #include "test/UnitTest/FPMatcher.h" -// #include "utils/MPFRWrapper/MPFRUtils.h" -// -// namespace mpfr = LIBC_NAMESPACE::testing::mpfr; -// -// // Range of both inputs: [0, inf] -// static constexpr uint16_t START = 0x0000U; -// static constexpr uint16_t STOP = 0x7C00U; -// -// struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { -// using FloatType = float16; -// using FPBits = LIBC_NAMESPACE::fputil::FPBits; -// using StorageType = typename FPBits::StorageType; -// -// uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) -// { -// mpfr::ForceRoundingMode r(rounding); -// if (!r.success) -// return true; -// uint16_t xbits = start; -// uint64_t failed = 0; -// do { -// float16 x = FPBits(xbits).get_val(); -// uint16_t ybits = xbits; -// do { -// float16 y = FPBits(ybits).get_val(); -// bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y), -// LIBC_NAMESPACE::hypotf16(x, y)); -// // Using MPFR will be much slower. -// // mpfr::BinaryInput input{x, y}; -// // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY( -// // mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y), -// 0.5, -// // rounding); -// failed += (!correct); -// } while (ybits++ < STOP); -// } while (xbits++ < stop); -// return failed; -// } -// }; -// -// using LlvmLibcHypotf16ExhaustiveTest = -// LlvmLibcExhaustiveMathTest; -// -// TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { -// test_full_range_all_roundings(START, STOP); -// } +#include "exhaustive_test.h" +#include "src/__support/FPUtil/FPBits.h" +#include "src/__support/FPUtil/Hypot.h" +#include "src/math/hypotf16.h" +#include "test/UnitTest/FPMatcher.h" +#include "utils/MPFRWrapper/MPFRUtils.h" + +namespace mpfr = LIBC_NAMESPACE::testing::mpfr; + +// Range of both inputs: [0, inf] +static constexpr uint16_t START = 0x0000U; +static constexpr uint16_t STOP = 0x7C00U; + +struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { + using FloatType = float16; + using FPBits = LIBC_NAMESPACE::fputil::FPBits; + using StorageType = typename FPBits::StorageType; + + uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) + { + mpfr::ForceRoundingMode r(rounding); + if (!r.success) + return true; + uint16_t xbits = start; + uint64_t failed = 0; + do { + float16 x = FPBits(xbits).get_val(); + uint16_t ybits = xbits; + do { + float16 y = FPBits(ybits).get_val(); + bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y), + LIBC_NAMESPACE::hypotf16(x, y)); + // Using MPFR will be much slower. + // mpfr::BinaryInput input{x, y}; + // bool correct = TEST_MPFR_MATCH_ROUNDING_SILENTLY( + // mpfr::Operation::Hypot, input, LIBC_NAMESPACE::hypotf16(x, y), + // 0.5, + // rounding); + failed += (!correct); + } while (ybits++ < STOP); + } while (xbits++ < stop); + return failed; + } +}; + +using LlvmLibcHypotf16ExhaustiveTest = + LlvmLibcExhaustiveMathTest; + +TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { + test_full_range_all_roundings(START, STOP); +} diff --git a/libc/test/src/math/hypotf16_hard_to_round.h b/libc/test/src/math/hypotf16_hard_to_round.h new file mode 100644 index 0000000000000..00e3066b00e61 --- /dev/null +++ b/libc/test/src/math/hypotf16_hard_to_round.h @@ -0,0 +1,1022 @@ +//===-- Hard-to-round inputs for hypotf16 ----------------------------C++--===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H +#define LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H + +#include "utils/MPFRWrapper/MPFRUtils.h" + +namespace mpfr = LIBC_NAMESPACE::testing::mpfr; + +// 1000 cases where the precise result is between two consecutive +// Float16 numbers +constexpr int N_HARD_TO_ROUND = 1000; +constexpr mpfr::BinaryInput HYPOTF16_HARD_TO_ROUND[N_HARD_TO_ROUND] = { + {0x1.3b8p-5, 0x1.d94p-6}, + {0x1.068p-7, 0x1.1ccp-8}, + {0x1.1dp-3, 0x1.4c8p-5}, + {0x1.c38p-2, 0x1.784p-3}, + {0x1.e3cp-3, 0x1.02p-3}, + {0x1.04p-8, 0x1.b3p-11}, + {0x1.e3p+5, 0x1.928p+4}, + {0x1.8bp+4, 0x1.638p+2}, + {0x1.4fp+1, 0x1.2d8p-1}, + {0x1.458p+3, 0x1.0f4p+2}, + {0x1.c08p+1, 0x1.75cp+0}, + {0x1.1fp-13, 0x1.524p-14}, + {0x1.36p-3, 0x1.2e4p-4}, + {0x1.b58p-9, 0x1.3ecp-10}, + {0x1.d74p+6, 0x1.a7p+6}, + {0x1.dc4p-6, 0x1.fcp-7}, + {0x1.6f8p-3, 0x1.324p-4}, + {0x1.86p+13, 0x1.7c4p+12}, + {0x1.9c8p+4, 0x1.57cp+3}, + {0x1.81p+7, 0x1.638p+5}, + {0x1.488p+9, 0x1.11cp+8}, + {0x1.0a8p+12, 0x1.f68p+10}, + {0x1.008p-8, 0x1.bcp-13}, + {0x1.818p-8, 0x1.414p-9}, + {0x1.efp+1, 0x1.814p+1}, + {0x1.b6cp+6, 0x1.11p+6}, + {0x1.458p+10, 0x1.93p+7}, + {0x1.058p+13, 0x1.884p+12}, + {0x1.ae8p+7, 0x1.0a8p+5}, + {0x1.9c8p+7, 0x1.60cp+6}, + {0x1.2cp+2, 0x1.14cp+1}, + {0x1.9bp+13, 0x1.df8p+11}, + {0x1.b2p+14, 0x1.d1p+11}, + {0x1.f8p-10, 0x1.d1cp-10}, + {0x1.22p-13, 0x1.7b8p-15}, + {0x1.cep-13, 0x1.104p-13}, + {0x1.2e8p+5, 0x1.cep+1}, + {0x1.edp-10, 0x1.71cp-10}, + {0x1.6f8p+12, 0x1.96p+8}, + {0x1.e78p+7, 0x1.32p+3}, + {0x1.2dp-1, 0x1.62cp-2}, + {0x1.ab8p-4, 0x1.72p-8}, + {0x1.ab8p+7, 0x1.398p+5}, + {0x1.97p-10, 0x1.1b8p-12}, + {0x1.eap+5, 0x1.068p+3}, + {0x1.fdp+11, 0x1.7dcp+11}, + {0x1.fbp-14, 0x1.b04p-14}, + {0x1.3bp+14, 0x1.6f8p+12}, + {0x1.4c8p+5, 0x1.c8cp+4}, + {0x1.848p-3, 0x1.e1p-6}, + {0x1.72p+4, 0x1.68cp+3}, + {0x1.2a8p-10, 0x1.bfcp-11}, + {0x1.d8cp+9, 0x1.59p+9}, + {0x1.e3p+12, 0x1.a2cp+12}, + {0x1.81p-8, 0x1.5a8p-10}, + {0x1.b48p+3, 0x1.6bcp+2}, + {0x1.14p+8, 0x1.bbcp+7}, + {0x1.72p-1, 0x1.cep-5}, + {0x1.068p-3, 0x1.aa4p-4}, + {0x1.7b8p+5, 0x1.e8cp+4}, + {0x1.14p-9, 0x1.998p-11}, + {0x1.878p+1, 0x1.83cp+0}, + {0x1.068p+5, 0x1.41cp+4}, + {0x1.0bp+14, 0x1.378p+12}, + {0x1.2dp-2, 0x1.0a4p-3}, + {0x1.ed8p+10, 0x1.bdp+7}, + {0x1.f8p+5, 0x1.158p+4}, + {0x1.44p-2, 0x1.62cp-3}, + {0x1.a4p+11, 0x1.ce8p+9}, + {0x1.fbp+5, 0x1.45p+2}, + {0x1.1dp+4, 0x1.4c8p+2}, + {0x1.2a8p-1, 0x1.f18p-3}, + {0x1.2dp-11, 0x1.0a4p-12}, + {0x1.c2p-8, 0x1.b6cp-9}, + {0x1.adp+12, 0x1.41cp+12}, + {0x1.9fp+4, 0x1.758p+2}, + {0x1.42p-7, 0x1.59p-10}, + {0x1.198p-8, 0x1.a64p-9}, + {0x1.f2cp-2, 0x1.56p-3}, + {0x1.e14p-2, 0x1.b9p-2}, + {0x1.158p+7, 0x1.d5p+4}, + {0x1.1f8p+7, 0x1.af4p+6}, + {0x1.d88p-6, 0x1.8fp-9}, + {0x1.38p-8, 0x1.f1p-11}, + {0x1.3bp-8, 0x1.1cp-13}, + {0x1.4a8p-4, 0x1.efcp-5}, + {0x1.efp-2, 0x1.848p-3}, + {0x1.cep-1, 0x1.75cp-1}, + {0x1.098p+12, 0x1.ba8p+10}, + {0x1.1fp+13, 0x1.c08p+11}, + {0x1.d9p-12, 0x1.5cp-17}, + {0x1.89cp+8, 0x1.77p+8}, + {0x1.158p+0, 0x1.97p-3}, + {0x1.d7p+1, 0x1.614p+1}, + {0x1.b3p+5, 0x1.878p+3}, + {0x1.028p-4, 0x1.af4p-5}, + {0x1.93p-6, 0x1.b3cp-7}, + {0x1.4d8p+13, 0x1.f44p+12}, + {0x1.d4cp+5, 0x1.f4p+4}, + {0x1.efp-11, 0x1.59p-14}, + {0x1.b6cp+11, 0x1.11p+11}, + {0x1.328p+11, 0x1.cbcp+10}, + {0x1.bap+0, 0x1.be4p-1}, + {0x1.318p+11, 0x1.ca4p+10}, + {0x1.74cp-13, 0x1.63p-13}, + {0x1.3bp+11, 0x1.1b8p+9}, + {0x1.278p-5, 0x1.bb4p-6}, + {0x1.1f8p+7, 0x1.74cp+6}, + {0x1.848p-12, 0x1.8bp-15}, + {0x1.28p-5, 0x1.59p-8}, + {0x1.9ep+11, 0x1.87p+8}, + {0x1.d38p-10, 0x1.e78p-12}, + {0x1.abp-8, 0x1.f74p-9}, + {0x1.5fp+12, 0x1.c2p+8}, + {0x1.dbp-13, 0x1.998p-14}, + {0x1.0e8p-5, 0x1.95cp-6}, + {0x1.98p+6, 0x1.8a4p+5}, + {0x1.998p+0, 0x1.fbp-3}, + {0x1.188p+2, 0x1.d38p+0}, + {0x1.efp-5, 0x1.814p-5}, + {0x1.dbp-10, 0x1.464p-10}, + {0x1.1a8p-10, 0x1.a7cp-11}, + {0x1.068p-12, 0x1.41cp-13}, + {0x1.ba8p-4, 0x1.448p-6}, + {0x1.658p+10, 0x1.89cp+9}, + {0x1.9c8p+2, 0x1.2e8p+0}, + {0x1.d88p-12, 0x1.89cp-13}, + {0x1.508p+4, 0x1.f8cp+3}, + {0x1.c2p-8, 0x1.be4p-8}, + {0x1.d4cp+9, 0x1.f4p+8}, + {0x1.198p+5, 0x1.a64p+4}, + {0x1.9ap-5, 0x1.44p-10}, + {0x1.d5p+5, 0x1.5fcp+5}, + {0x1.dbp-3, 0x1.ab8p-5}, + {0x1.efp-14, 0x1.3ecp-14}, + {0x1.05p+0, 0x1.c7p-3}, + {0x1.c7p+15, 0x1.998p+13}, + {0x1.658p+7, 0x1.7b8p+5}, + {0x1.c98p+11, 0x1.7d4p+10}, + {0x1.c2p+2, 0x1.a9p-1}, + {0x1.fdp-9, 0x1.7dcp-9}, + {0x1.3bp-6, 0x1.6f8p-8}, + {0x1.d18p+3, 0x1.de8p+1}, + {0x1.2cp+1, 0x1.36p-3}, + {0x1.458p-4, 0x1.e84p-5}, + {0x1.3f8p+8, 0x1.df4p+7}, + {0x1.c2p+1, 0x1.26p-3}, + {0x1.e5p+9, 0x1.6bcp+9}, + {0x1.e7p+4, 0x1.6d4p+4}, + {0x1.318p-12, 0x1.7f4p-13}, + {0x1.cbp-2, 0x1.0bcp-3}, + {0x1.068p-3, 0x1.41cp-4}, + {0x1.55p+10, 0x1.e78p+8}, + {0x1.c5cp+14, 0x1.8cp+14}, + {0x1.a28p-1, 0x1.ddcp-2}, + {0x1.848p-7, 0x1.43cp-8}, + {0x1.9ecp-6, 0x1.8bp-6}, + {0x1.3bp-2, 0x1.364p-3}, + {0x1.c2p+13, 0x1.26p+9}, + {0x1.1b8p-13, 0x1.a94p-14}, + {0x1.dbp+11, 0x1.ab8p+9}, + {0x1.f3p-13, 0x1.764p-13}, + {0x1.32p+7, 0x1.ae8p+5}, + {0x1.2dp-4, 0x1.0a4p-5}, + {0x1.d8cp+7, 0x1.59p+7}, + {0x1.05p+1, 0x1.308p-1}, + {0x1.d64p+7, 0x1.11p+7}, + {0x1.6f8p+7, 0x1.324p+6}, + {0x1.d88p+8, 0x1.248p+6}, + {0x1.008p+5, 0x1.ab8p+3}, + {0x1.248p+4, 0x1.f2cp+3}, + {0x1.e5p-11, 0x1.b48p-13}, + {0x1.c2p+7, 0x1.964p+7}, + {0x1.fa4p+0, 0x1.3bp+0}, + {0x1.058p-12, 0x1.884p-13}, + {0x1.f2p-13, 0x1.228p-14}, + {0x1.c5cp-14, 0x1.8cp-14}, + {0x1.cep+4, 0x1.75cp+4}, + {0x1.71p+15, 0x1.81p+12}, + {0x1.3bp+12, 0x1.644p+11}, + {0x1.188p-8, 0x1.0cp-13}, + {0x1.2fp+9, 0x1.618p+7}, + {0x1.088p+11, 0x1.8ccp+10}, + {0x1.c3p+9, 0x1.524p+9}, + {0x1.f2cp+8, 0x1.44p+8}, + {0x1.11p-7, 0x1.34cp-8}, + {0x1.efp+9, 0x1.848p+8}, + {0x1.fa4p+11, 0x1.0ep+11}, + {0x1.3e8p-7, 0x1.ddcp-8}, + {0x1.288p-13, 0x1.bccp-14}, + {0x1.518p-8, 0x1.fa4p-9}, + {0x1.c7p-3, 0x1.944p-4}, + {0x1.338p+3, 0x1.c3p+0}, + {0x1.1b8p+14, 0x1.d88p+12}, + {0x1.d7p-5, 0x1.614p-5}, + {0x1.9ep+6, 0x1.87p+3}, + {0x1.e9p+13, 0x1.6ecp+13}, + {0x1.9dp-3, 0x1.35cp-3}, + {0x1.318p+13, 0x1.ca4p+12}, + {0x1.11p+1, 0x1.cd4p+0}, + {0x1.26p-10, 0x1.3bp-13}, + {0x1.adp+14, 0x1.13p+11}, + {0x1.9bcp-7, 0x1.76p-7}, + {0x1.e6p-10, 0x1.cbp-13}, + {0x1.dbp-2, 0x1.86p-6}, + {0x1.f2cp+3, 0x1.dbp+3}, + {0x1.2a8p+3, 0x1.bfcp+2}, + {0x1.f2cp+14, 0x1.0ap+14}, + {0x1.5cp+13, 0x1.b6cp+12}, + {0x1.3d8p+3, 0x1.dc4p+2}, + {0x1.0b8p-10, 0x1.914p-11}, + {0x1.5cp+3, 0x1.6dcp+2}, + {0x1.ba8p+0, 0x1.70cp-1}, + {0x1.45p-2, 0x1.20cp-3}, + {0x1.ab8p+5, 0x1.72p+1}, + {0x1.dbp-13, 0x1.86p-17}, + {0x1.aep-9, 0x1.6a4p-9}, + {0x1.298p-13, 0x1.14p-18}, + {0x1.0f8p-10, 0x1.974p-11}, + {0x1.ddp+1, 0x1.65cp+1}, + {0x1.d88p-6, 0x1.5a8p-8}, + {0x1.08p-4, 0x1.04p-9}, + {0x1.318p-1, 0x1.ca4p-2}, + {0x1.45p-8, 0x1.248p-10}, + {0x1.068p+14, 0x1.1ccp+13}, + {0x1.468p+13, 0x1.e9cp+12}, + {0x1.aa4p-9, 0x1.74p-9}, + {0x1.02p+3, 0x1.3e4p+2}, + {0x1.6bp-11, 0x1.a78p-13}, + {0x1.158p-5, 0x1.d5p-8}, + {0x1.0f8p-4, 0x1.974p-5}, + {0x1.1ep-1, 0x1.728p-3}, + {0x1.a9p+8, 0x1.7e8p+6}, + {0x1.86p+13, 0x1.3cp+8}, + {0x1.c2p+6, 0x1.8ecp+6}, + {0x1.238p-4, 0x1.b54p-5}, + {0x1.3bp-13, 0x1.734p-14}, + {0x1.aep-3, 0x1.f2p-7}, + {0x1.2cp+7, 0x1.36p+3}, + {0x1.70cp+13, 0x1.65p+13}, + {0x1.ed8p-9, 0x1.bdp-12}, + {0x1.188p+15, 0x1.248p+13}, + {0x1.5ep+15, 0x1.77p+12}, + {0x1.bd8p-8, 0x1.6f8p-10}, + {0x1.e78p+8, 0x1.32p+4}, + {0x1.c38p-8, 0x1.784p-9}, + {0x1.008p+5, 0x1.658p+3}, + {0x1.6f8p-9, 0x1.0d8p-11}, + {0x1.9c8p-13, 0x1.2e8p-15}, + {0x1.4f8p+15, 0x1.f74p+14}, + {0x1.158p+11, 0x1.d5p+8}, + {0x1.9c8p-3, 0x1.57cp-4}, + {0x1.0c8p+15, 0x1.bf8p+13}, + {0x1.5a8p-3, 0x1.518p-5}, + {0x1.e84p+7, 0x1.d1p+7}, + {0x1.abp-12, 0x1.f74p-13}, + {0x1.1ep+13, 0x1.728p+11}, + {0x1.8cp-3, 0x1.e14p-4}, + {0x1.6d8p+7, 0x1.5a8p+5}, + {0x1.e9p-13, 0x1.6ecp-13}, + {0x1.7e8p+10, 0x1.188p+8}, + {0x1.17p+10, 0x1.f7cp+9}, + {0x1.dfp-8, 0x1.674p-8}, + {0x1.d34p+5, 0x1.bdp+5}, + {0x1.018p-2, 0x1.824p-3}, + {0x1.6f8p-13, 0x1.c7p-16}, + {0x1.a58p+11, 0x1.5f4p+10}, + {0x1.e3cp+3, 0x1.02p+3}, + {0x1.cbp-5, 0x1.584p-5}, + {0x1.5a8p+9, 0x1.3c4p+8}, + {0x1.528p-8, 0x1.fbcp-9}, + {0x1.1b8p+9, 0x1.a94p+8}, + {0x1.788p-7, 0x1.39cp-8}, + {0x1.f2cp+4, 0x1.56p+3}, + {0x1.f2cp+2, 0x1.fap+1}, + {0x1.218p+5, 0x1.b24p+4}, + {0x1.fbp+4, 0x1.7c4p+4}, + {0x1.45p-3, 0x1.20cp-4}, + {0x1.368p+12, 0x1.338p+10}, + {0x1.1ep-3, 0x1.20cp-4}, + {0x1.c5p+6, 0x1.084p+5}, + {0x1.afp+12, 0x1.434p+12}, + {0x1.bfp-3, 0x1.4f4p-3}, + {0x1.d4p+8, 0x1.d88p+7}, + {0x1.e3cp-5, 0x1.02p-5}, + {0x1.adp+9, 0x1.6dcp+9}, + {0x1.b8p+3, 0x1.f44p+2}, + {0x1.ddcp+7, 0x1.c7p+7}, + {0x1.248p-10, 0x1.e78p-12}, + {0x1.efp+13, 0x1.9c8p+12}, + {0x1.a2p+5, 0x1.89cp+5}, + {0x1.298p+8, 0x1.be4p+7}, + {0x1.0f8p-12, 0x1.974p-13}, + {0x1.dcp-8, 0x1.cep-12}, + {0x1.c38p+0, 0x1.784p-1}, + {0x1.038p+11, 0x1.854p+10}, + {0x1.b3cp+11, 0x1.9fp+11}, + {0x1.5fp-4, 0x1.c2p-8}, + {0x1.c7p+2, 0x1.554p+2}, + {0x1.c38p-12, 0x1.178p-14}, + {0x1.f14p+2, 0x1.cep+2}, + {0x1.3e8p-13, 0x1.ddcp-14}, + {0x1.188p+12, 0x1.248p+10}, + {0x1.b04p-13, 0x1.1dp-13}, + {0x1.c5cp-7, 0x1.8cp-7}, + {0x1.22p-11, 0x1.7b8p-13}, + {0x1.338p+0, 0x1.868p-2}, + {0x1.f44p+2, 0x1.d4p+0}, + {0x1.0d8p+1, 0x1.944p+0}, + {0x1.a88p-9, 0x1.61cp-10}, + {0x1.178p+14, 0x1.254p+13}, + {0x1.2cp+15, 0x1.36p+11}, + {0x1.7ap-1, 0x1.95p-4}, + {0x1.adp+14, 0x1.f48p+12}, + {0x1.c2p-2, 0x1.964p-2}, + {0x1.a1p-6, 0x1.38cp-6}, + {0x1.518p+6, 0x1.efp+3}, + {0x1.32p+1, 0x1.fa4p+0}, + {0x1.ccp-11, 0x1.0bcp-11}, + {0x1.96p+14, 0x1.b3p+11}, + {0x1.308p+14, 0x1.fb8p+12}, + {0x1.02p-11, 0x1.3e4p-12}, + {0x1.be4p+1, 0x1.76p+1}, + {0x1.c08p-3, 0x1.b9p-6}, + {0x1.e3p-13, 0x1.928p-14}, + {0x1.218p-2, 0x1.b24p-3}, + {0x1.22p+5, 0x1.1acp+4}, + {0x1.bfp+14, 0x1.4f4p+14}, + {0x1.78p-5, 0x1.284p-6}, + {0x1.ae8p-4, 0x1.4cp-9}, + {0x1.c2p-12, 0x1.be4p-12}, + {0x1.458p+6, 0x1.e84p+5}, + {0x1.efp-14, 0x1.fb8p-15}, + {0x1.cd4p-1, 0x1.1fp-1}, + {0x1.71p+12, 0x1.81p+9}, + {0x1.cbp+4, 0x1.584p+4}, + {0x1.3d8p-1, 0x1.dc4p-2}, + {0x1.c2p+9, 0x1.68cp+9}, + {0x1.128p+1, 0x1.c98p-1}, + {0x1.068p-4, 0x1.7e8p-6}, + {0x1.178p-6, 0x1.a34p-7}, + {0x1.c38p+7, 0x1.784p+6}, + {0x1.158p+6, 0x1.ce8p+4}, + {0x1.e78p-12, 0x1.658p-14}, + {0x1.83p-7, 0x1.7d4p-7}, + {0x1.658p-3, 0x1.7b8p-5}, + {0x1.bd8p+3, 0x1.734p+2}, + {0x1.408p+3, 0x1.e0cp+2}, + {0x1.d1p+5, 0x1.0f4p+4}, + {0x1.848p-9, 0x1.43cp-10}, + {0x1.ccp-8, 0x1.554p-9}, + {0x1.45p+4, 0x1.248p+2}, + {0x1.a5p-10, 0x1.3bcp-10}, + {0x1.65p-4, 0x1.a08p-6}, + {0x1.408p-9, 0x1.e0cp-10}, + {0x1.c38p+3, 0x1.54p-2}, + {0x1.518p+12, 0x1.194p+11}, + {0x1.c2p-11, 0x1.8ecp-11}, + {0x1.d88p-1, 0x1.8fp-4}, + {0x1.268p+6, 0x1.b9cp+5}, + {0x1.74p+11, 0x1.4fcp+10}, + {0x1.188p-2, 0x1.0cp-7}, + {0x1.c7p+8, 0x1.998p+6}, + {0x1.3fp+13, 0x1.11cp+12}, + {0x1.608p-5, 0x1.474p-6}, + {0x1.4ap+4, 0x1.ffp+1}, + {0x1.3bp-13, 0x1.a34p-14}, + {0x1.5f8p+3, 0x1.2cp-2}, + {0x1.58p-5, 0x1.9c8p-7}, + {0x1.f2cp+14, 0x1.56p+13}, + {0x1.988p+3, 0x1.95p+0}, + {0x1.f2cp+13, 0x1.fap+12}, + {0x1.e14p+6, 0x1.a4p+6}, + {0x1.efp-7, 0x1.64p-12}, + {0x1.fbp-8, 0x1.7c4p-8}, + {0x1.95p-4, 0x1.6c8p-6}, + {0x1.68p+9, 0x1.f48p+7}, + {0x1.668p+5, 0x1.2acp+4}, + {0x1.608p+15, 0x1.028p+13}, + {0x1.13p+8, 0x1.47cp+7}, + {0x1.518p-13, 0x1.c38p-15}, + {0x1.5a8p+0, 0x1.adp-3}, + {0x1.f5p-10, 0x1.77cp-10}, + {0x1.05p-5, 0x1.c7p-8}, + {0x1.b3cp-10, 0x1.9fp-10}, + {0x1.488p-13, 0x1.11cp-14}, + {0x1.e3p+2, 0x1.a2cp+2}, + {0x1.8ecp+2, 0x1.5cp+2}, + {0x1.abp-4, 0x1.404p-4}, + {0x1.398p-11, 0x1.71p-14}, + {0x1.c2p-7, 0x1.a9p-10}, + {0x1.d8cp+1, 0x1.59p+1}, + {0x1.848p-2, 0x1.8bp-5}, + {0x1.0ep-5, 0x1.b38p-7}, + {0x1.d9p+14, 0x1.554p+14}, + {0x1.aep+2, 0x1.a34p+1}, + {0x1.d64p+14, 0x1.81p+14}, + {0x1.8a8p+0, 0x1.48cp-1}, + {0x1.308p+3, 0x1.79p+0}, + {0x1.6f8p+3, 0x1.774p+2}, + {0x1.428p+1, 0x1.d9p-2}, + {0x1.108p-5, 0x1.98cp-6}, + {0x1.b9p+11, 0x1.014p+10}, + {0x1.de8p+5, 0x1.0bcp+4}, + {0x1.b6cp-1, 0x1.b5p-1}, + {0x1.cep-6, 0x1.75cp-6}, + {0x1.0f8p+9, 0x1.974p+8}, + {0x1.ee8p+10, 0x1.0bp+7}, + {0x1.2cp+15, 0x1.14cp+14}, + {0x1.5f8p-11, 0x1.2cp-16}, + {0x1.f7cp-13, 0x1.efp-13}, + {0x1.2fp+12, 0x1.618p+10}, + {0x1.0e8p-3, 0x1.95cp-4}, + {0x1.a1p+11, 0x1.38cp+11}, + {0x1.86p-11, 0x1.7c4p-12}, + {0x1.028p+7, 0x1.83cp+6}, + {0x1.f74p+5, 0x1.49p+5}, + {0x1.65p+3, 0x1.c64p+2}, + {0x1.8fp-9, 0x1.7bcp-10}, + {0x1.f14p-5, 0x1.52p-5}, + {0x1.e48p+15, 0x1.214p+14}, + {0x1.fbp+5, 0x1.7c4p+5}, + {0x1.1fp-3, 0x1.c08p-5}, + {0x1.248p+6, 0x1.838p+4}, + {0x1.65p+10, 0x1.fb8p+8}, + {0x1.4c8p-5, 0x1.b6p-9}, + {0x1.a88p+11, 0x1.61cp+10}, + {0x1.458p+5, 0x1.93p+2}, + {0x1.d18p+1, 0x1.de8p-1}, + {0x1.6dp+1, 0x1.488p-1}, + {0x1.698p-5, 0x1.2d4p-6}, + {0x1.3f8p-2, 0x1.df4p-3}, + {0x1.b3p-7, 0x1.878p-9}, + {0x1.1b8p-5, 0x1.02cp-6}, + {0x1.518p-3, 0x1.1dp-6}, + {0x1.198p+2, 0x1.a64p+1}, + {0x1.098p-7, 0x1.ba8p-9}, + {0x1.b3p-8, 0x1.4acp-9}, + {0x1.a28p+4, 0x1.e8cp+3}, + {0x1.41p+13, 0x1.768p+11}, + {0x1.cfp-14, 0x1.5b4p-14}, + {0x1.31p-4, 0x1.128p-6}, + {0x1.83p-2, 0x1.148p-4}, + {0x1.498p+15, 0x1.ee4p+14}, + {0x1.b6cp-3, 0x1.5ep-3}, + {0x1.2a8p+7, 0x1.bfcp+6}, + {0x1.268p-5, 0x1.e3p-8}, + {0x1.7cp-4, 0x1.068p-6}, + {0x1.8fp-4, 0x1.7bcp-5}, + {0x1.95p-9, 0x1.ed8p-11}, + {0x1.29p+2, 0x1.2dcp+1}, + {0x1.dbp-9, 0x1.998p-10}, + {0x1.b1p-10, 0x1.44cp-10}, + {0x1.57p-9, 0x1.944p-10}, + {0x1.138p-9, 0x1.9d4p-10}, + {0x1.d64p-8, 0x1.11p-8}, + {0x1.928p+6, 0x1.bd8p+4}, + {0x1.2a8p+7, 0x1.f18p+5}, + {0x1.95p-6, 0x1.ed8p-8}, + {0x1.998p-9, 0x1.75cp-10}, + {0x1.57p+9, 0x1.944p+8}, + {0x1.998p+11, 0x1.fbp+8}, + {0x1.e3p-7, 0x1.a2cp-7}, + {0x1.efp+8, 0x1.bd8p+6}, + {0x1.d74p+1, 0x1.a7p+1}, + {0x1.f68p-13, 0x1.708p-15}, + {0x1.398p-8, 0x1.93cp-9}, + {0x1.3d8p+1, 0x1.dc4p+0}, + {0x1.efp-1, 0x1.64p-6}, + {0x1.02p-3, 0x1.3e4p-4}, + {0x1.a4p+5, 0x1.ce8p+3}, + {0x1.83p-5, 0x1.148p-7}, + {0x1.adp-9, 0x1.93cp-10}, + {0x1.7e8p-13, 0x1.188p-15}, + {0x1.248p+1, 0x1.838p-1}, + {0x1.adp-10, 0x1.f48p-12}, + {0x1.ecp-2, 0x1.378p-4}, + {0x1.998p-13, 0x1.fbp-16}, + {0x1.dbp-7, 0x1.86p-11}, + {0x1.e3cp-10, 0x1.02p-10}, + {0x1.bfp+2, 0x1.4f4p+2}, + {0x1.adp+7, 0x1.f48p+5}, + {0x1.6f8p+10, 0x1.0d8p+8}, + {0x1.f4p+13, 0x1.e78p+12}, + {0x1.0d8p-9, 0x1.944p-10}, + {0x1.3bp+8, 0x1.1cp+3}, + {0x1.c98p+10, 0x1.4f8p+8}, + {0x1.9fp-10, 0x1.758p-12}, + {0x1.9c8p-4, 0x1.2e8p-6}, + {0x1.d9p-1, 0x1.5cp-6}, + {0x1.ddp+11, 0x1.8d8p+10}, + {0x1.308p-1, 0x1.79p-4}, + {0x1.9bp+12, 0x1.344p+12}, + {0x1.d7p+12, 0x1.12cp+11}, + {0x1.e7p-13, 0x1.6d4p-13}, + {0x1.518p+11, 0x1.bacp+10}, + {0x1.fep+11, 0x1.cbp+9}, + {0x1.e3cp+2, 0x1.02p+2}, + {0x1.098p+0, 0x1.8e4p-1}, + {0x1.538p-10, 0x1.fd4p-11}, + {0x1.858p-3, 0x1.dap-7}, + {0x1.71p-12, 0x1.ae8p-14}, + {0x1.e3p-9, 0x1.34cp-9}, + {0x1.ab8p+13, 0x1.69p+10}, + {0x1.1b8p+3, 0x1.a94p+2}, + {0x1.f14p-12, 0x1.52p-12}, + {0x1.988p+13, 0x1.95p+10}, + {0x1.998p+7, 0x1.e6p+3}, + {0x1.f68p+8, 0x1.708p+6}, + {0x1.81p+15, 0x1.e84p+14}, + {0x1.ae8p+8, 0x1.0a8p+6}, + {0x1.29p+10, 0x1.2dcp+9}, + {0x1.118p-8, 0x1.9a4p-9}, + {0x1.59p+1, 0x1.368p-1}, + {0x1.efp+1, 0x1.9c8p+0}, + {0x1.d7p-9, 0x1.614p-9}, + {0x1.4b8p-5, 0x1.6dp-8}, + {0x1.4c8p-12, 0x1.9c8p-14}, + {0x1.f8p-13, 0x1.158p-14}, + {0x1.41p+10, 0x1.768p+8}, + {0x1.29p-3, 0x1.2dcp-4}, + {0x1.c08p-8, 0x1.75cp-9}, + {0x1.538p-7, 0x1.fd4p-8}, + {0x1.518p-4, 0x1.fa4p-5}, + {0x1.2dp+4, 0x1.62cp+3}, + {0x1.49p-9, 0x1.83cp-10}, + {0x1.6bp+3, 0x1.fap-1}, + {0x1.efp+3, 0x1.734p+3}, + {0x1.038p-5, 0x1.b08p-7}, + {0x1.f3p-3, 0x1.764p-3}, + {0x1.65p-7, 0x1.93cp-8}, + {0x1.73p+13, 0x1.fa4p+12}, + {0x1.a1p+5, 0x1.38cp+5}, + {0x1.9bp-10, 0x1.344p-10}, + {0x1.068p+13, 0x1.1ccp+12}, + {0x1.d38p+15, 0x1.65p+12}, + {0x1.0ep+15, 0x1.074p+14}, + {0x1.b2p+7, 0x1.d1p+4}, + {0x1.0a8p+4, 0x1.f68p+2}, + {0x1.fccp+2, 0x1.bcp+2}, + {0x1.998p-10, 0x1.e6p-14}, + {0x1.83p+10, 0x1.148p+8}, + {0x1.488p+5, 0x1.eccp+4}, + {0x1.e3p-3, 0x1.a2cp-3}, + {0x1.1fp-4, 0x1.524p-5}, + {0x1.428p-3, 0x1.da8p-5}, + {0x1.34p-6, 0x1.d88p-8}, + {0x1.a28p+8, 0x1.e8cp+7}, + {0x1.348p+6, 0x1.cecp+5}, + {0x1.65p+14, 0x1.734p+13}, + {0x1.59p-5, 0x1.928p-7}, + {0x1.068p-11, 0x1.81p-14}, + {0x1.cep+14, 0x1.2b4p+13}, + {0x1.188p+0, 0x1.248p-2}, + {0x1.8bp+9, 0x1.638p+7}, + {0x1.4ap+12, 0x1.bacp+11}, + {0x1.e78p+12, 0x1.e98p+10}, + {0x1.3bp+3, 0x1.1b8p+1}, + {0x1.268p-9, 0x1.e3p-12}, + {0x1.28p-13, 0x1.59p-16}, + {0x1.efp+12, 0x1.814p+12}, + {0x1.7e8p+2, 0x1.3ecp+1}, + {0x1.e1p+15, 0x1.4dcp+14}, + {0x1.1e8p+14, 0x1.dd8p+12}, + {0x1.83p-4, 0x1.7d4p-4}, + {0x1.65p+9, 0x1.734p+8}, + {0x1.72p+11, 0x1.68cp+10}, + {0x1.848p-4, 0x1.43cp-5}, + {0x1.908p+13, 0x1.4dcp+12}, + {0x1.f7cp-9, 0x1.98p-9}, + {0x1.efp+8, 0x1.814p+8}, + {0x1.cf8p+3, 0x1.824p+2}, + {0x1.7cp-12, 0x1.068p-14}, + {0x1.adp-11, 0x1.f48p-13}, + {0x1.a4p+9, 0x1.b2p+5}, + {0x1.178p+12, 0x1.254p+11}, + {0x1.d1p+11, 0x1.a4cp+10}, + {0x1.7b8p+10, 0x1.e8cp+9}, + {0x1.b3p+13, 0x1.464p+13}, + {0x1.a28p+8, 0x1.5ccp+7}, + {0x1.288p+7, 0x1.bccp+6}, + {0x1.bfp+3, 0x1.4f4p+3}, + {0x1.d1p+13, 0x1.a4cp+12}, + {0x1.038p+1, 0x1.b08p-1}, + {0x1.bd8p+7, 0x1.c8cp+6}, + {0x1.bdp+10, 0x1.4dcp+10}, + {0x1.bap-12, 0x1.be4p-13}, + {0x1.efp+4, 0x1.59p+1}, + {0x1.3bp+9, 0x1.1b8p+7}, + {0x1.c7p-10, 0x1.944p-11}, + {0x1.86p+14, 0x1.3cp+9}, + {0x1.26p-11, 0x1.3bp-14}, + {0x1.a9p+2, 0x1.158p+0}, + {0x1.3bp-5, 0x1.734p-6}, + {0x1.6cp+13, 0x1.308p+11}, + {0x1.83p-6, 0x1.7d4p-6}, + {0x1.008p-13, 0x1.658p-15}, + {0x1.b18p+3, 0x1.694p+2}, + {0x1.11p+10, 0x1.41cp+9}, + {0x1.9dp-8, 0x1.e6cp-9}, + {0x1.2dp+3, 0x1.0a4p+2}, + {0x1.5f8p-7, 0x1.2cp-12}, + {0x1.248p-7, 0x1.368p-9}, + {0x1.d7cp+6, 0x1.95p+6}, + {0x1.fep-12, 0x1.4dp-14}, + {0x1.158p-5, 0x1.a04p-6}, + {0x1.378p-10, 0x1.d34p-11}, + {0x1.e7p+10, 0x1.6d4p+10}, + {0x1.208p-9, 0x1.b0cp-10}, + {0x1.c7p-14, 0x1.554p-14}, + {0x1.38p-13, 0x1.f1p-16}, + {0x1.278p+1, 0x1.ec8p-1}, + {0x1.7e8p+13, 0x1.5ep+9}, + {0x1.95p+7, 0x1.6c8p+5}, + {0x1.c2p+11, 0x1.b6cp+10}, + {0x1.fdp-7, 0x1.7dcp-7}, + {0x1.428p+4, 0x1.d9p+1}, + {0x1.ddcp-3, 0x1.dcp-4}, + {0x1.adp+13, 0x1.93cp+12}, + {0x1.e14p-5, 0x1.c2p-6}, + {0x1.608p+5, 0x1.028p+3}, + {0x1.518p+11, 0x1.1dp+8}, + {0x1.f2cp-12, 0x1.dbp-12}, + {0x1.ab8p+9, 0x1.644p+8}, + {0x1.e6p+7, 0x1.cbp+4}, + {0x1.e84p+9, 0x1.d1p+9}, + {0x1.458p-10, 0x1.93p-13}, + {0x1.068p-10, 0x1.81p-13}, + {0x1.59p+0, 0x1.e14p-1}, + {0x1.2e8p+15, 0x1.c5cp+14}, + {0x1.a1p+9, 0x1.38cp+9}, + {0x1.d64p-11, 0x1.11p-11}, + {0x1.488p+0, 0x1.11cp-1}, + {0x1.7ap-13, 0x1.65p-16}, + {0x1.96p-4, 0x1.b3p-7}, + {0x1.8ecp+11, 0x1.5cp+11}, + {0x1.3fp-11, 0x1.11cp-12}, + {0x1.3bp-13, 0x1.ecp-18}, + {0x1.ce8p-8, 0x1.1acp-9}, + {0x1.a28p-13, 0x1.ddcp-14}, + {0x1.488p+4, 0x1.11cp+3}, + {0x1.228p+9, 0x1.b3cp+8}, + {0x1.298p+15, 0x1.14p+10}, + {0x1.ccp+10, 0x1.0bcp+10}, + {0x1.efp+6, 0x1.814p+6}, + {0x1.8d8p+3, 0x1.4b4p+2}, + {0x1.0ep+1, 0x1.6a4p+0}, + {0x1.8f8p+0, 0x1.074p-1}, + {0x1.368p+12, 0x1.02cp+11}, + {0x1.59p-4, 0x1.83p-7}, + {0x1.efp+7, 0x1.848p+6}, + {0x1.998p-5, 0x1.554p-6}, + {0x1.65p+0, 0x1.c64p-1}, + {0x1.29p+8, 0x1.9ep+4}, + {0x1.9ap+3, 0x1.404p+3}, + {0x1.368p-10, 0x1.338p-12}, + {0x1.e3p+0, 0x1.a2cp+0}, + {0x1.8fp+6, 0x1.d64p+5}, + {0x1.5a8p+12, 0x1.3c4p+11}, + {0x1.e48p-7, 0x1.214p-8}, + {0x1.378p-5, 0x1.d34p-6}, + {0x1.ebp-8, 0x1.704p-8}, + {0x1.5a8p+5, 0x1.634p+4}, + {0x1.e3p-9, 0x1.928p-10}, + {0x1.258p+7, 0x1.b84p+6}, + {0x1.5a8p-4, 0x1.20cp-5}, + {0x1.08p-9, 0x1.04p-14}, + {0x1.188p-3, 0x1.0cp-8}, + {0x1.fep-10, 0x1.4dp-12}, + {0x1.4c8p-6, 0x1.f2cp-7}, + {0x1.aep-11, 0x1.a34p-12}, + {0x1.3a8p-7, 0x1.d7cp-8}, + {0x1.fd4p-3, 0x1.e5p-3}, + {0x1.068p+14, 0x1.22p+10}, + {0x1.71p+7, 0x1.81p+4}, + {0x1.1c8p-12, 0x1.aacp-13}, + {0x1.c5p+7, 0x1.084p+6}, + {0x1.dcp-4, 0x1.89cp-4}, + {0x1.7e8p-7, 0x1.b28p-9}, + {0x1.fep+7, 0x1.4dp+5}, + {0x1.068p+9, 0x1.7e8p+7}, + {0x1.59p+7, 0x1.e14p+6}, + {0x1.7ap+12, 0x1.65p+9}, + {0x1.158p-11, 0x1.ce8p-13}, + {0x1.adp+8, 0x1.6dcp+8}, + {0x1.008p+2, 0x1.80cp+1}, + {0x1.4d8p+9, 0x1.3ecp+8}, + {0x1.4b8p+6, 0x1.144p+5}, + {0x1.59p-6, 0x1.e14p-7}, + {0x1.1b8p-9, 0x1.8fcp-10}, + {0x1.b9p+14, 0x1.4acp+14}, + {0x1.378p-13, 0x1.d34p-14}, + {0x1.f2cp+1, 0x1.dcp-1}, + {0x1.be8p-6, 0x1.7e8p-8}, + {0x1.878p+11, 0x1.464p+10}, + {0x1.c9p+12, 0x1.56cp+12}, + {0x1.3e8p-12, 0x1.7ap-16}, + {0x1.7e8p-10, 0x1.b28p-12}, + {0x1.28p+10, 0x1.59p+7}, + {0x1.c2p-11, 0x1.be4p-11}, + {0x1.d4p+1, 0x1.314p+1}, + {0x1.ab8p-12, 0x1.69p-15}, + {0x1.e9p+5, 0x1.978p+4}, + {0x1.3f8p-4, 0x1.df4p-5}, + {0x1.c2p+6, 0x1.26p+2}, + {0x1.5a8p-7, 0x1.3c4p-8}, + {0x1.f2cp-3, 0x1.fap-4}, + {0x1.aa4p-11, 0x1.74p-11}, + {0x1.89cp-10, 0x1.4ap-10}, + {0x1.928p+7, 0x1.a04p+6}, + {0x1.878p-11, 0x1.464p-12}, + {0x1.0b8p+14, 0x1.914p+13}, + {0x1.f2cp-1, 0x1.fap-2}, + {0x1.fep+7, 0x1.6a8p+6}, + {0x1.c08p+10, 0x1.298p+8}, + {0x1.2a8p+13, 0x1.bfcp+12}, + {0x1.d5p+10, 0x1.5fcp+10}, + {0x1.96p+3, 0x1.b3p+0}, + {0x1.f44p-7, 0x1.d4p-9}, + {0x1.efp+3, 0x1.814p+3}, + {0x1.bfp-5, 0x1.4f4p-5}, + {0x1.4c8p+0, 0x1.9c8p-2}, + {0x1.de8p+11, 0x1.0bcp+10}, + {0x1.59p-8, 0x1.83p-11}, + {0x1.028p-5, 0x1.83cp-6}, + {0x1.f8p-10, 0x1.158p-11}, + {0x1.b3p+11, 0x1.464p+11}, + {0x1.1b8p+7, 0x1.a94p+6}, + {0x1.13p+14, 0x1.47cp+13}, + {0x1.e78p+11, 0x1.658p+9}, + {0x1.098p+15, 0x1.ba8p+13}, + {0x1.878p+13, 0x1.464p+12}, + {0x1.4dp+1, 0x1.24p-4}, + {0x1.ab8p+12, 0x1.644p+11}, + {0x1.968p-3, 0x1.52cp-4}, + {0x1.de8p+10, 0x1.0bcp+9}, + {0x1.adp-10, 0x1.a04p-10}, + {0x1.7cp-3, 0x1.734p-3}, + {0x1.b3p-9, 0x1.878p-11}, + {0x1.d18p+9, 0x1.20cp+8}, + {0x1.1b8p-12, 0x1.5fp-15}, + {0x1.81p+12, 0x1.c5cp+11}, + {0x1.13p-8, 0x1.47cp-9}, + {0x1.7e8p+5, 0x1.188p+3}, + {0x1.d9p-5, 0x1.554p-5}, + {0x1.d5p+0, 0x1.5fcp+0}, + {0x1.f7cp-4, 0x1.efp-4}, + {0x1.cdp+1, 0x1.59cp+1}, + {0x1.abp+0, 0x1.f74p-1}, + {0x1.81p-5, 0x1.638p-7}, + {0x1.d8cp+2, 0x1.59p+2}, + {0x1.cep+7, 0x1.75cp+7}, + {0x1.9dp+12, 0x1.35cp+12}, + {0x1.22p-6, 0x1.7b8p-8}, + {0x1.83p+0, 0x1.7d4p+0}, + {0x1.3e8p-11, 0x1.ddcp-12}, + {0x1.a28p+1, 0x1.5ccp+0}, + {0x1.848p-5, 0x1.43cp-6}, + {0x1.f7cp-7, 0x1.efp-7}, + {0x1.d7p+13, 0x1.12cp+12}, + {0x1.d3p+5, 0x1.5e4p+5}, + {0x1.efp-9, 0x1.848p-10}, + {0x1.848p+2, 0x1.43cp+1}, + {0x1.e3p+0, 0x1.928p-1}, + {0x1.098p-8, 0x1.ba8p-10}, + {0x1.d34p-7, 0x1.bdp-7}, + {0x1.3f8p-12, 0x1.0a4p-13}, + {0x1.e3p+7, 0x1.19cp+6}, + {0x1.02p+8, 0x1.3e4p+7}, + {0x1.d9p-9, 0x1.62cp-9}, + {0x1.a28p-7, 0x1.ddcp-8}, + {0x1.c98p+9, 0x1.7d4p+8}, + {0x1.1dp+5, 0x1.008p+3}, + {0x1.9ap+0, 0x1.8fcp-1}, + {0x1.9ep-11, 0x1.1ap-15}, + {0x1.81p-4, 0x1.5a8p-6}, + {0x1.218p+13, 0x1.e28p+11}, + {0x1.608p+6, 0x1.474p+5}, + {0x1.49p+2, 0x1.83cp+1}, + {0x1.258p+1, 0x1.b84p+0}, + {0x1.e14p-8, 0x1.b9p-8}, + {0x1.7f4p-9, 0x1.6dp-9}, + {0x1.76p-9, 0x1.e48p-11}, + {0x1.56p-9, 0x1.428p-11}, + {0x1.57p-12, 0x1.944p-13}, + {0x1.ae8p-9, 0x1.4cp-14}, + {0x1.4dp-10, 0x1.24p-15}, + {0x1.668p+3, 0x1.2acp+2}, + {0x1.238p-11, 0x1.b54p-12}, + {0x1.9dp-11, 0x1.35cp-11}, + {0x1.368p-12, 0x1.d1cp-13}, + {0x1.c5p+10, 0x1.53cp+10}, + {0x1.3bp-7, 0x1.1cp-12}, + {0x1.338p+2, 0x1.cd4p+1}, + {0x1.e3p+13, 0x1.6a4p+13}, + {0x1.cep-2, 0x1.efp-5}, + {0x1.848p+9, 0x1.43cp+8}, + {0x1.998p+14, 0x1.75cp+13}, + {0x1.9f8p-2, 0x1.5a4p-3}, + {0x1.c3p+5, 0x1.2b4p+5}, + {0x1.8fp-2, 0x1.7bcp-3}, + {0x1.3c8p-3, 0x1.07cp-4}, + {0x1.83p+6, 0x1.7d4p+6}, + {0x1.81p+10, 0x1.c5cp+9}, + {0x1.05p+3, 0x1.c7p+0}, + {0x1.098p+14, 0x1.ba8p+12}, + {0x1.28p-11, 0x1.59p-14}, + {0x1.e84p+2, 0x1.d1p+2}, + {0x1.9c8p+14, 0x1.a7p+11}, + {0x1.4e8p+6, 0x1.f5cp+5}, + {0x1.358p-12, 0x1.d04p-13}, + {0x1.158p+9, 0x1.d5p+6}, + {0x1.e78p-6, 0x1.02cp-7}, + {0x1.a1p-9, 0x1.e68p-11}, + {0x1.458p+9, 0x1.e84p+8}, + {0x1.ae8p+9, 0x1.4cp+4}, + {0x1.518p-9, 0x1.194p-10}, + {0x1.79p-12, 0x1.d1cp-13}, + {0x1.068p-3, 0x1.22p-7}, + {0x1.b7p-1, 0x1.494p-1}, + {0x1.fep-5, 0x1.6a8p-6}, + {0x1.b5p+6, 0x1.47cp+6}, + {0x1.de8p-8, 0x1.0bcp-9}, + {0x1.6d8p+4, 0x1.5a8p+2}, + {0x1.878p+14, 0x1.83cp+13}, + {0x1.ba8p-8, 0x1.70cp-9}, + {0x1.bcp-3, 0x1.d38p-5}, + {0x1.a28p+6, 0x1.e8cp+5}, + {0x1.cbp+12, 0x1.464p+11}, + {0x1.13p-11, 0x1.5ccp-12}, + {0x1.1dp+6, 0x1.4c8p+4}, + {0x1.74cp+7, 0x1.63p+7}, + {0x1.eap-13, 0x1.068p-15}, + {0x1.068p+5, 0x1.aa4p+4}, + {0x1.8bp-9, 0x1.638p-11}, + {0x1.e3p-5, 0x1.f38p-6}, + {0x1.abcp+10, 0x1.4ap+10}, + {0x1.9c8p-6, 0x1.3bp-9}, + {0x1.c28p+6, 0x1.9d4p+5}, + {0x1.57p+12, 0x1.944p+11}, + {0x1.34p+1, 0x1.d88p-1}, + {0x1.0ap-13, 0x1.1dp-16}, + {0x1.3e8p+9, 0x1.ddcp+8}, + {0x1.e3p+1, 0x1.19cp+0}, + {0x1.c2p-7, 0x1.8ecp-7}, + {0x1.2dp+12, 0x1.62cp+11}, + {0x1.028p+12, 0x1.af4p+11}, + {0x1.e9p+1, 0x1.1d4p+0}, + {0x1.578p-6, 0x1.1e4p-7}, + {0x1.c28p-13, 0x1.9d4p-14}, + {0x1.188p+7, 0x1.d38p+5}, + {0x1.908p+10, 0x1.4dcp+9}, + {0x1.338p-3, 0x1.cd4p-4}, + {0x1.1d8p+0, 0x1.ac4p-1}, + {0x1.a1p-8, 0x1.e68p-10}, + {0x1.f2cp-9, 0x1.a2p-9}, + {0x1.218p+7, 0x1.e28p+5}, + {0x1.c2p-10, 0x1.964p-10}, + {0x1.f4p+7, 0x1.e78p+6}, + {0x1.cc8p+12, 0x1.7fcp+11}, + {0x1.9dp-3, 0x1.e6cp-4}, + {0x1.4c8p-4, 0x1.e48p-6}, + {0x1.f8p-5, 0x1.324p-5}, + {0x1.cep-2, 0x1.2b4p-3}, + {0x1.838p+12, 0x1.80cp+11}, + {0x1.45p-2, 0x1.248p-4}, + {0x1.ccp-14, 0x1.0bcp-14}, + {0x1.4ap+8, 0x1.ffp+5}, + {0x1.8d8p-5, 0x1.238p-7}, + {0x1.648p+6, 0x1.20cp+5}, + {0x1.b48p-13, 0x1.6bcp-14}, + {0x1.0ep+4, 0x1.fep+0}, + {0x1.458p-7, 0x1.e84p-8}, + {0x1.2b8p+15, 0x1.c14p+14}, + {0x1.4b8p+15, 0x1.e14p+14}, + {0x1.3a8p+0, 0x1.aap-4}, + {0x1.77p-7, 0x1.b58p-9}, + {0x1.83p+14, 0x1.c38p+12}, + {0x1.2a8p-12, 0x1.bfcp-13}, + {0x1.ed8p+8, 0x1.bdp+5}, + {0x1.d58p-10, 0x1.874p-11}, + {0x1.e78p-7, 0x1.e98p-9}, + {0x1.a98p+3, 0x1.758p+1}, + {0x1.038p-10, 0x1.b08p-12}, + {0x1.4c8p-8, 0x1.c8cp-9}, + {0x1.5a8p-2, 0x1.634p-3}, + {0x1.9c8p-11, 0x1.57cp-12}, + {0x1.6a8p-11, 0x1.9ecp-12}, + {0x1.70cp+4, 0x1.65p+4}, + {0x1.a98p+10, 0x1.758p+8}, + {0x1.d28p+15, 0x1.84cp+14}, + {0x1.d64p+4, 0x1.11p+4}, + {0x1.848p+6, 0x1.43cp+5}, + {0x1.c3p-3, 0x1.fep-7}, + {0x1.8fp-6, 0x1.5ecp-6}, + {0x1.ab8p+3, 0x1.69p+0}, + {0x1.028p-2, 0x1.af4p-3}, + {0x1.ccp-2, 0x1.0bcp-2}, + {0x1.c98p-5, 0x1.7d4p-6}, + {0x1.8fp+1, 0x1.d18p-1}, + {0x1.be4p+12, 0x1.76p+12}, + {0x1.a58p-9, 0x1.5f4p-10}, + {0x1.f2cp+6, 0x1.56p+5}, + {0x1.86p+6, 0x1.82cp+6}, + {0x1.458p+7, 0x1.93p+4}, + {0x1.3bp+0, 0x1.644p-1}, + {0x1.9bp+6, 0x1.df8p+4}, + {0x1.b58p+2, 0x1.3ecp+1}, + {0x1.788p+6, 0x1.39cp+5}, + {0x1.068p+5, 0x1.b58p+3}, + {0x1.bcp+9, 0x1.d38p+7}, + {0x1.e14p-13, 0x1.b9p-13}, + {0x1.e6p+5, 0x1.b6cp+5}, + {0x1.cep+13, 0x1.2b4p+12}, + {0x1.908p+1, 0x1.4dcp+0}, + {0x1.e5p-8, 0x1.b48p-10}, + {0x1.d34p+9, 0x1.bdp+9}, + {0x1.4b8p+3, 0x1.e14p+2}, + {0x1.3c8p+2, 0x1.dacp+1}, + {0x1.4dp-5, 0x1.848p-7}, + {0x1.49p-1, 0x1.644p-2}, + {0x1.efp+6, 0x1.fb8p+5}, + {0x1.288p-5, 0x1.bccp-6}, + {0x1.9c8p+2, 0x1.57cp+1}, + {0x1.81p-6, 0x1.c5cp-7}, + {0x1.57p+2, 0x1.944p+1}, + {0x1.4ap-12, 0x1.ffp-15}, + {0x1.1dp-1, 0x1.4c8p-3}, + {0x1.a2p+13, 0x1.89cp+13}, + {0x1.218p-12, 0x1.b24p-13}, + {0x1.3f8p-5, 0x1.0a4p-6}, + {0x1.9ap+15, 0x1.44p+10}, + {0x1.a9p-11, 0x1.7e8p-13}, + {0x1.23p-3, 0x1.538p-5}, + {0x1.59p-10, 0x1.928p-12}, + {0x1.89cp-5, 0x1.77p-5}, + {0x1.c2p-4, 0x1.8ecp-4}, + {0x1.218p-7, 0x1.b24p-8}, + {0x1.ed8p-2, 0x1.bdp-5}, + {0x1.fep-8, 0x1.298p-9}, + {0x1.e78p-2, 0x1.32p-6}, + {0x1.3f8p-2, 0x1.0a4p-3}, + {0x1.bacp-5, 0x1.65p-5}, + {0x1.308p-5, 0x1.e3cp-6}, + {0x1.d1p-12, 0x1.a4cp-13}, + {0x1.368p+1, 0x1.02cp+0}, + {0x1.2d8p-11, 0x1.f68p-13}, + {0x1.9ecp+2, 0x1.8bp+2}, + {0x1.338p+8, 0x1.cd4p+7}, + {0x1.8bp-7, 0x1.638p-9}, + {0x1.d88p+5, 0x1.5a8p+3}, + {0x1.4ap-6, 0x1.ffp-9}, + {0x1.e9p+7, 0x1.978p+6}, + {0x1.128p+1, 0x1.9bcp+0}, + {0x1.56p+8, 0x1.43p+5}, + {0x1.298p+11, 0x1.4acp+10}, + {0x1.368p-10, 0x1.5acp-11}, + {0x1.3a8p-12, 0x1.aap-16}, + {0x1.77p-1, 0x1.b58p-3}, + {0x1.6f8p-10, 0x1.774p-11}, + {0x1.928p+13, 0x1.a04p+12}, + {0x1.f2cp+6, 0x1.dbp+6}, + {0x1.5a8p+7, 0x1.adp+4}, + {0x1.b2p-7, 0x1.d1p-10}, + {0x1.e3cp+9, 0x1.02p+9}, + {0x1.35p-8, 0x1.688p-10}, + {0x1.9dp-4, 0x1.35cp-4}, + {0x1.a4p+14, 0x1.ce8p+12}, + {0x1.d18p+11, 0x1.de8p+9}, + {0x1.318p+6, 0x1.ca4p+5}, + {0x1.298p-3, 0x1.be4p-4}, + {0x1.2cp+0, 0x1.36p-4}, + {0x1.2dp+9, 0x1.0a4p+8}, + {0x1.c08p+12, 0x1.b9p+9}, + {0x1.f7p-1, 0x1.794p-1}, + {0x1.ce8p-4, 0x1.1acp-5}, + {0x1.76p+15, 0x1.e48p+13}, + {0x1.31p+2, 0x1.128p+0}, + {0x1.338p-2, 0x1.868p-4}, + {0x1.e3cp-10, 0x1.2dp-10}, + {0x1.e78p-10, 0x1.02cp-11}, + {0x1.d7p-1, 0x1.12cp-2}, + {0x1.81p-2, 0x1.5a8p-4}, + {0x1.ffp-5, 0x1.7f4p-5}, + {0x1.6f8p-7, 0x1.c7p-10}, + {0x1.f7cp-11, 0x1.98p-11}, + {0x1.b3p+12, 0x1.fb8p+10}, + {0x1.4b8p+12, 0x1.224p+11}, + {0x1.8d8p-13, 0x1.dd4p-14}, + {0x1.e14p+0, 0x1.c2p-1}, + {0x1.248p-2, 0x1.524p-3}, + {0x1.a3p+12, 0x1.3a4p+12}, + {0x1.bdp-11, 0x1.4dcp-11}, + {0x1.418p+0, 0x1.e24p-1}, + {0x1.fep-9, 0x1.6a8p-10}, + {0x1.a98p-8, 0x1.758p-10}, + {0x1.1dp+11, 0x1.0f4p+10}, + {0x1.5a8p+0, 0x1.20cp-1}, + {0x1.f2cp-3, 0x1.0ap-3}, + {0x1.7e8p+15, 0x1.188p+13}, +}; + +#endif // LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H diff --git a/libc/test/src/math/hypotf16_test.cpp b/libc/test/src/math/hypotf16_test.cpp index 82d18c38568c9..cdb6c345e9d7b 100644 --- a/libc/test/src/math/hypotf16_test.cpp +++ b/libc/test/src/math/hypotf16_test.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// #include "HypotTest.h" -#include "hypotf_hard_to_round.h" +#include "hypotf16_hard_to_round.h" #include "src/math/hypotf16.h" @@ -21,7 +21,7 @@ TEST_F(LlvmLibcHypotf16Test, NormalRange) { test_normal_range(&LIBC_NAMESPACE::hypotf16); } -// TEST_F(LlvmLibcHypotf16Test, TrickyInputs) { -// test_input_list(&LIBC_NAMESPACE::hypotf16, N_HARD_TO_ROUND, -// HYPOTF_HARD_TO_ROUND); -// } +TEST_F(LlvmLibcHypotf16Test, TrickyInputs) { + test_input_list(&LIBC_NAMESPACE::hypotf16, N_HARD_TO_ROUND, + HYPOTF16_HARD_TO_ROUND); +} diff --git a/libc/test/src/math/smoke/hypotf16_test.cpp b/libc/test/src/math/smoke/hypotf16_test.cpp index d56cdc457a134..b48b0930431de 100644 --- a/libc/test/src/math/smoke/hypotf16_test.cpp +++ b/libc/test/src/math/smoke/hypotf16_test.cpp @@ -6,30 +6,12 @@ // //===----------------------------------------------------------------------===// -#include "src/errno/libc_errno.h" +#include "HypotTest.h" + #include "src/math/hypotf16.h" -#include "test/UnitTest/FPMatcher.h" -#include "test/UnitTest/Test.h" -using LlvmLibcHypotf16Test = LIBC_NAMESPACE::testing::FPTest; +using LlvmLibcHypotf16Test = HypotTestTemplate; TEST_F(LlvmLibcHypotf16Test, SpecialNumbers) { - LIBC_NAMESPACE::libc_errno = 0; - EXPECT_FP_EQ(inf, LIBC_NAMESPACE::hypotf16(inf, aNaN)); - EXPECT_MATH_ERRNO(0); - EXPECT_FP_EQ(inf, LIBC_NAMESPACE::hypotf16(aNaN, neg_inf)); - EXPECT_MATH_ERRNO(0); - EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::hypotf16(aNaN, aNaN)); - EXPECT_MATH_ERRNO(0); - EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::hypotf16(sNaN, zero)); - EXPECT_MATH_ERRNO(0); - EXPECT_FP_EQ(aNaN, LIBC_NAMESPACE::hypotf16(neg_zero, sNaN)); - EXPECT_MATH_ERRNO(0); - - EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(inf, sNaN), - FE_INVALID); - EXPECT_MATH_ERRNO(0); - EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::hypotf16(sNaN, neg_inf), - FE_INVALID); - EXPECT_MATH_ERRNO(0); + test_special_numbers(&LIBC_NAMESPACE::hypotf16); } From 66514de04f61964c7267f82aa42285e9407640b6 Mon Sep 17 00:00:00 2001 From: meltq Date: Mon, 24 Mar 2025 08:32:24 +0530 Subject: [PATCH 08/21] Formatting changes --- libc/src/math/generic/CMakeLists.txt | 1 + libc/src/math/generic/hypotf16.cpp | 2 +- libc/test/src/math/CMakeLists.txt | 1 - .../src/math/exhaustive/hypotf16_test.cpp | 3 +- libc/test/src/math/hypotf16_hard_to_round.h | 1502 ++++++----------- libc/test/src/math/smoke/CMakeLists.txt | 1 - 6 files changed, 504 insertions(+), 1006 deletions(-) diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt index 7ec2e0bf9e865..e980d103a1d22 100644 --- a/libc/src/math/generic/CMakeLists.txt +++ b/libc/src/math/generic/CMakeLists.txt @@ -3114,6 +3114,7 @@ add_entrypoint_object( DEPENDS libc.src.__support.FPUtil.fenv_impl libc.src.__support.FPUtil.fp_bits + libc.src.__support.FPUtil.cast libc.src.__support.FPUtil.multiply_add libc.src.__support.FPUtil.sqrt libc.src.__support.macros.optimization diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp index 75323c5cf5aa8..b7255bc4420db 100644 --- a/libc/src/math/generic/hypotf16.cpp +++ b/libc/src/math/generic/hypotf16.cpp @@ -1,4 +1,4 @@ -//===-- Implementation of hypotf function ---------------------------------===// +//===-- Implementation of hypotf16 function -------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. diff --git a/libc/test/src/math/CMakeLists.txt b/libc/test/src/math/CMakeLists.txt index 79ae9377afd28..6daaacac99345 100644 --- a/libc/test/src/math/CMakeLists.txt +++ b/libc/test/src/math/CMakeLists.txt @@ -1710,7 +1710,6 @@ add_fp_unittest( hypotf16_test.cpp DEPENDS libc.src.math.hypotf16 - libc.src.__support.FPUtil.fp_bits ) add_fp_unittest( diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index 4defb11d02ee6..3ba752bd81f24 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -24,8 +24,7 @@ struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { using FPBits = LIBC_NAMESPACE::fputil::FPBits; using StorageType = typename FPBits::StorageType; - uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) - { + uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) { mpfr::ForceRoundingMode r(rounding); if (!r.success) return true; diff --git a/libc/test/src/math/hypotf16_hard_to_round.h b/libc/test/src/math/hypotf16_hard_to_round.h index 00e3066b00e61..15e0dc13adbf3 100644 --- a/libc/test/src/math/hypotf16_hard_to_round.h +++ b/libc/test/src/math/hypotf16_hard_to_round.h @@ -13,1010 +13,510 @@ namespace mpfr = LIBC_NAMESPACE::testing::mpfr; -// 1000 cases where the precise result is between two consecutive +// 1000 cases where the precise result is between two consecutive // Float16 numbers constexpr int N_HARD_TO_ROUND = 1000; constexpr mpfr::BinaryInput HYPOTF16_HARD_TO_ROUND[N_HARD_TO_ROUND] = { - {0x1.3b8p-5, 0x1.d94p-6}, - {0x1.068p-7, 0x1.1ccp-8}, - {0x1.1dp-3, 0x1.4c8p-5}, - {0x1.c38p-2, 0x1.784p-3}, - {0x1.e3cp-3, 0x1.02p-3}, - {0x1.04p-8, 0x1.b3p-11}, - {0x1.e3p+5, 0x1.928p+4}, - {0x1.8bp+4, 0x1.638p+2}, - {0x1.4fp+1, 0x1.2d8p-1}, - {0x1.458p+3, 0x1.0f4p+2}, - {0x1.c08p+1, 0x1.75cp+0}, - {0x1.1fp-13, 0x1.524p-14}, - {0x1.36p-3, 0x1.2e4p-4}, - {0x1.b58p-9, 0x1.3ecp-10}, - {0x1.d74p+6, 0x1.a7p+6}, - {0x1.dc4p-6, 0x1.fcp-7}, - {0x1.6f8p-3, 0x1.324p-4}, - {0x1.86p+13, 0x1.7c4p+12}, - {0x1.9c8p+4, 0x1.57cp+3}, - {0x1.81p+7, 0x1.638p+5}, - {0x1.488p+9, 0x1.11cp+8}, - {0x1.0a8p+12, 0x1.f68p+10}, - {0x1.008p-8, 0x1.bcp-13}, - {0x1.818p-8, 0x1.414p-9}, - {0x1.efp+1, 0x1.814p+1}, - {0x1.b6cp+6, 0x1.11p+6}, - {0x1.458p+10, 0x1.93p+7}, - {0x1.058p+13, 0x1.884p+12}, - {0x1.ae8p+7, 0x1.0a8p+5}, - {0x1.9c8p+7, 0x1.60cp+6}, - {0x1.2cp+2, 0x1.14cp+1}, - {0x1.9bp+13, 0x1.df8p+11}, - {0x1.b2p+14, 0x1.d1p+11}, - {0x1.f8p-10, 0x1.d1cp-10}, - {0x1.22p-13, 0x1.7b8p-15}, - {0x1.cep-13, 0x1.104p-13}, - {0x1.2e8p+5, 0x1.cep+1}, - {0x1.edp-10, 0x1.71cp-10}, - {0x1.6f8p+12, 0x1.96p+8}, - {0x1.e78p+7, 0x1.32p+3}, - {0x1.2dp-1, 0x1.62cp-2}, - {0x1.ab8p-4, 0x1.72p-8}, - {0x1.ab8p+7, 0x1.398p+5}, - {0x1.97p-10, 0x1.1b8p-12}, - {0x1.eap+5, 0x1.068p+3}, - {0x1.fdp+11, 0x1.7dcp+11}, - {0x1.fbp-14, 0x1.b04p-14}, - {0x1.3bp+14, 0x1.6f8p+12}, - {0x1.4c8p+5, 0x1.c8cp+4}, - {0x1.848p-3, 0x1.e1p-6}, - {0x1.72p+4, 0x1.68cp+3}, - {0x1.2a8p-10, 0x1.bfcp-11}, - {0x1.d8cp+9, 0x1.59p+9}, - {0x1.e3p+12, 0x1.a2cp+12}, - {0x1.81p-8, 0x1.5a8p-10}, - {0x1.b48p+3, 0x1.6bcp+2}, - {0x1.14p+8, 0x1.bbcp+7}, - {0x1.72p-1, 0x1.cep-5}, - {0x1.068p-3, 0x1.aa4p-4}, - {0x1.7b8p+5, 0x1.e8cp+4}, - {0x1.14p-9, 0x1.998p-11}, - {0x1.878p+1, 0x1.83cp+0}, - {0x1.068p+5, 0x1.41cp+4}, - {0x1.0bp+14, 0x1.378p+12}, - {0x1.2dp-2, 0x1.0a4p-3}, - {0x1.ed8p+10, 0x1.bdp+7}, - {0x1.f8p+5, 0x1.158p+4}, - {0x1.44p-2, 0x1.62cp-3}, - {0x1.a4p+11, 0x1.ce8p+9}, - {0x1.fbp+5, 0x1.45p+2}, - {0x1.1dp+4, 0x1.4c8p+2}, - {0x1.2a8p-1, 0x1.f18p-3}, - {0x1.2dp-11, 0x1.0a4p-12}, - {0x1.c2p-8, 0x1.b6cp-9}, - {0x1.adp+12, 0x1.41cp+12}, - {0x1.9fp+4, 0x1.758p+2}, - {0x1.42p-7, 0x1.59p-10}, - {0x1.198p-8, 0x1.a64p-9}, - {0x1.f2cp-2, 0x1.56p-3}, - {0x1.e14p-2, 0x1.b9p-2}, - {0x1.158p+7, 0x1.d5p+4}, - {0x1.1f8p+7, 0x1.af4p+6}, - {0x1.d88p-6, 0x1.8fp-9}, - {0x1.38p-8, 0x1.f1p-11}, - {0x1.3bp-8, 0x1.1cp-13}, - {0x1.4a8p-4, 0x1.efcp-5}, - {0x1.efp-2, 0x1.848p-3}, - {0x1.cep-1, 0x1.75cp-1}, - {0x1.098p+12, 0x1.ba8p+10}, - {0x1.1fp+13, 0x1.c08p+11}, - {0x1.d9p-12, 0x1.5cp-17}, - {0x1.89cp+8, 0x1.77p+8}, - {0x1.158p+0, 0x1.97p-3}, - {0x1.d7p+1, 0x1.614p+1}, - {0x1.b3p+5, 0x1.878p+3}, - {0x1.028p-4, 0x1.af4p-5}, - {0x1.93p-6, 0x1.b3cp-7}, - {0x1.4d8p+13, 0x1.f44p+12}, - {0x1.d4cp+5, 0x1.f4p+4}, - {0x1.efp-11, 0x1.59p-14}, - {0x1.b6cp+11, 0x1.11p+11}, - {0x1.328p+11, 0x1.cbcp+10}, - {0x1.bap+0, 0x1.be4p-1}, - {0x1.318p+11, 0x1.ca4p+10}, - {0x1.74cp-13, 0x1.63p-13}, - {0x1.3bp+11, 0x1.1b8p+9}, - {0x1.278p-5, 0x1.bb4p-6}, - {0x1.1f8p+7, 0x1.74cp+6}, - {0x1.848p-12, 0x1.8bp-15}, - {0x1.28p-5, 0x1.59p-8}, - {0x1.9ep+11, 0x1.87p+8}, - {0x1.d38p-10, 0x1.e78p-12}, - {0x1.abp-8, 0x1.f74p-9}, - {0x1.5fp+12, 0x1.c2p+8}, - {0x1.dbp-13, 0x1.998p-14}, - {0x1.0e8p-5, 0x1.95cp-6}, - {0x1.98p+6, 0x1.8a4p+5}, - {0x1.998p+0, 0x1.fbp-3}, - {0x1.188p+2, 0x1.d38p+0}, - {0x1.efp-5, 0x1.814p-5}, - {0x1.dbp-10, 0x1.464p-10}, - {0x1.1a8p-10, 0x1.a7cp-11}, - {0x1.068p-12, 0x1.41cp-13}, - {0x1.ba8p-4, 0x1.448p-6}, - {0x1.658p+10, 0x1.89cp+9}, - {0x1.9c8p+2, 0x1.2e8p+0}, - {0x1.d88p-12, 0x1.89cp-13}, - {0x1.508p+4, 0x1.f8cp+3}, - {0x1.c2p-8, 0x1.be4p-8}, - {0x1.d4cp+9, 0x1.f4p+8}, - {0x1.198p+5, 0x1.a64p+4}, - {0x1.9ap-5, 0x1.44p-10}, - {0x1.d5p+5, 0x1.5fcp+5}, - {0x1.dbp-3, 0x1.ab8p-5}, - {0x1.efp-14, 0x1.3ecp-14}, - {0x1.05p+0, 0x1.c7p-3}, - {0x1.c7p+15, 0x1.998p+13}, - {0x1.658p+7, 0x1.7b8p+5}, - {0x1.c98p+11, 0x1.7d4p+10}, - {0x1.c2p+2, 0x1.a9p-1}, - {0x1.fdp-9, 0x1.7dcp-9}, - {0x1.3bp-6, 0x1.6f8p-8}, - {0x1.d18p+3, 0x1.de8p+1}, - {0x1.2cp+1, 0x1.36p-3}, - {0x1.458p-4, 0x1.e84p-5}, - {0x1.3f8p+8, 0x1.df4p+7}, - {0x1.c2p+1, 0x1.26p-3}, - {0x1.e5p+9, 0x1.6bcp+9}, - {0x1.e7p+4, 0x1.6d4p+4}, - {0x1.318p-12, 0x1.7f4p-13}, - {0x1.cbp-2, 0x1.0bcp-3}, - {0x1.068p-3, 0x1.41cp-4}, - {0x1.55p+10, 0x1.e78p+8}, - {0x1.c5cp+14, 0x1.8cp+14}, - {0x1.a28p-1, 0x1.ddcp-2}, - {0x1.848p-7, 0x1.43cp-8}, - {0x1.9ecp-6, 0x1.8bp-6}, - {0x1.3bp-2, 0x1.364p-3}, - {0x1.c2p+13, 0x1.26p+9}, - {0x1.1b8p-13, 0x1.a94p-14}, - {0x1.dbp+11, 0x1.ab8p+9}, - {0x1.f3p-13, 0x1.764p-13}, - {0x1.32p+7, 0x1.ae8p+5}, - {0x1.2dp-4, 0x1.0a4p-5}, - {0x1.d8cp+7, 0x1.59p+7}, - {0x1.05p+1, 0x1.308p-1}, - {0x1.d64p+7, 0x1.11p+7}, - {0x1.6f8p+7, 0x1.324p+6}, - {0x1.d88p+8, 0x1.248p+6}, - {0x1.008p+5, 0x1.ab8p+3}, - {0x1.248p+4, 0x1.f2cp+3}, - {0x1.e5p-11, 0x1.b48p-13}, - {0x1.c2p+7, 0x1.964p+7}, - {0x1.fa4p+0, 0x1.3bp+0}, - {0x1.058p-12, 0x1.884p-13}, - {0x1.f2p-13, 0x1.228p-14}, - {0x1.c5cp-14, 0x1.8cp-14}, - {0x1.cep+4, 0x1.75cp+4}, - {0x1.71p+15, 0x1.81p+12}, - {0x1.3bp+12, 0x1.644p+11}, - {0x1.188p-8, 0x1.0cp-13}, - {0x1.2fp+9, 0x1.618p+7}, - {0x1.088p+11, 0x1.8ccp+10}, - {0x1.c3p+9, 0x1.524p+9}, - {0x1.f2cp+8, 0x1.44p+8}, - {0x1.11p-7, 0x1.34cp-8}, - {0x1.efp+9, 0x1.848p+8}, - {0x1.fa4p+11, 0x1.0ep+11}, - {0x1.3e8p-7, 0x1.ddcp-8}, - {0x1.288p-13, 0x1.bccp-14}, - {0x1.518p-8, 0x1.fa4p-9}, - {0x1.c7p-3, 0x1.944p-4}, - {0x1.338p+3, 0x1.c3p+0}, - {0x1.1b8p+14, 0x1.d88p+12}, - {0x1.d7p-5, 0x1.614p-5}, - {0x1.9ep+6, 0x1.87p+3}, - {0x1.e9p+13, 0x1.6ecp+13}, - {0x1.9dp-3, 0x1.35cp-3}, - {0x1.318p+13, 0x1.ca4p+12}, - {0x1.11p+1, 0x1.cd4p+0}, - {0x1.26p-10, 0x1.3bp-13}, - {0x1.adp+14, 0x1.13p+11}, - {0x1.9bcp-7, 0x1.76p-7}, - {0x1.e6p-10, 0x1.cbp-13}, - {0x1.dbp-2, 0x1.86p-6}, - {0x1.f2cp+3, 0x1.dbp+3}, - {0x1.2a8p+3, 0x1.bfcp+2}, - {0x1.f2cp+14, 0x1.0ap+14}, - {0x1.5cp+13, 0x1.b6cp+12}, - {0x1.3d8p+3, 0x1.dc4p+2}, - {0x1.0b8p-10, 0x1.914p-11}, - {0x1.5cp+3, 0x1.6dcp+2}, - {0x1.ba8p+0, 0x1.70cp-1}, - {0x1.45p-2, 0x1.20cp-3}, - {0x1.ab8p+5, 0x1.72p+1}, - {0x1.dbp-13, 0x1.86p-17}, - {0x1.aep-9, 0x1.6a4p-9}, - {0x1.298p-13, 0x1.14p-18}, - {0x1.0f8p-10, 0x1.974p-11}, - {0x1.ddp+1, 0x1.65cp+1}, - {0x1.d88p-6, 0x1.5a8p-8}, - {0x1.08p-4, 0x1.04p-9}, - {0x1.318p-1, 0x1.ca4p-2}, - {0x1.45p-8, 0x1.248p-10}, - {0x1.068p+14, 0x1.1ccp+13}, - {0x1.468p+13, 0x1.e9cp+12}, - {0x1.aa4p-9, 0x1.74p-9}, - {0x1.02p+3, 0x1.3e4p+2}, - {0x1.6bp-11, 0x1.a78p-13}, - {0x1.158p-5, 0x1.d5p-8}, - {0x1.0f8p-4, 0x1.974p-5}, - {0x1.1ep-1, 0x1.728p-3}, - {0x1.a9p+8, 0x1.7e8p+6}, - {0x1.86p+13, 0x1.3cp+8}, - {0x1.c2p+6, 0x1.8ecp+6}, - {0x1.238p-4, 0x1.b54p-5}, - {0x1.3bp-13, 0x1.734p-14}, - {0x1.aep-3, 0x1.f2p-7}, - {0x1.2cp+7, 0x1.36p+3}, - {0x1.70cp+13, 0x1.65p+13}, - {0x1.ed8p-9, 0x1.bdp-12}, - {0x1.188p+15, 0x1.248p+13}, - {0x1.5ep+15, 0x1.77p+12}, - {0x1.bd8p-8, 0x1.6f8p-10}, - {0x1.e78p+8, 0x1.32p+4}, - {0x1.c38p-8, 0x1.784p-9}, - {0x1.008p+5, 0x1.658p+3}, - {0x1.6f8p-9, 0x1.0d8p-11}, - {0x1.9c8p-13, 0x1.2e8p-15}, - {0x1.4f8p+15, 0x1.f74p+14}, - {0x1.158p+11, 0x1.d5p+8}, - {0x1.9c8p-3, 0x1.57cp-4}, - {0x1.0c8p+15, 0x1.bf8p+13}, - {0x1.5a8p-3, 0x1.518p-5}, - {0x1.e84p+7, 0x1.d1p+7}, - {0x1.abp-12, 0x1.f74p-13}, - {0x1.1ep+13, 0x1.728p+11}, - {0x1.8cp-3, 0x1.e14p-4}, - {0x1.6d8p+7, 0x1.5a8p+5}, - {0x1.e9p-13, 0x1.6ecp-13}, - {0x1.7e8p+10, 0x1.188p+8}, - {0x1.17p+10, 0x1.f7cp+9}, - {0x1.dfp-8, 0x1.674p-8}, - {0x1.d34p+5, 0x1.bdp+5}, - {0x1.018p-2, 0x1.824p-3}, - {0x1.6f8p-13, 0x1.c7p-16}, - {0x1.a58p+11, 0x1.5f4p+10}, - {0x1.e3cp+3, 0x1.02p+3}, - {0x1.cbp-5, 0x1.584p-5}, - {0x1.5a8p+9, 0x1.3c4p+8}, - {0x1.528p-8, 0x1.fbcp-9}, - {0x1.1b8p+9, 0x1.a94p+8}, - {0x1.788p-7, 0x1.39cp-8}, - {0x1.f2cp+4, 0x1.56p+3}, - {0x1.f2cp+2, 0x1.fap+1}, - {0x1.218p+5, 0x1.b24p+4}, - {0x1.fbp+4, 0x1.7c4p+4}, - {0x1.45p-3, 0x1.20cp-4}, - {0x1.368p+12, 0x1.338p+10}, - {0x1.1ep-3, 0x1.20cp-4}, - {0x1.c5p+6, 0x1.084p+5}, - {0x1.afp+12, 0x1.434p+12}, - {0x1.bfp-3, 0x1.4f4p-3}, - {0x1.d4p+8, 0x1.d88p+7}, - {0x1.e3cp-5, 0x1.02p-5}, - {0x1.adp+9, 0x1.6dcp+9}, - {0x1.b8p+3, 0x1.f44p+2}, - {0x1.ddcp+7, 0x1.c7p+7}, - {0x1.248p-10, 0x1.e78p-12}, - {0x1.efp+13, 0x1.9c8p+12}, - {0x1.a2p+5, 0x1.89cp+5}, - {0x1.298p+8, 0x1.be4p+7}, - {0x1.0f8p-12, 0x1.974p-13}, - {0x1.dcp-8, 0x1.cep-12}, - {0x1.c38p+0, 0x1.784p-1}, - {0x1.038p+11, 0x1.854p+10}, - {0x1.b3cp+11, 0x1.9fp+11}, - {0x1.5fp-4, 0x1.c2p-8}, - {0x1.c7p+2, 0x1.554p+2}, - {0x1.c38p-12, 0x1.178p-14}, - {0x1.f14p+2, 0x1.cep+2}, - {0x1.3e8p-13, 0x1.ddcp-14}, - {0x1.188p+12, 0x1.248p+10}, - {0x1.b04p-13, 0x1.1dp-13}, - {0x1.c5cp-7, 0x1.8cp-7}, - {0x1.22p-11, 0x1.7b8p-13}, - {0x1.338p+0, 0x1.868p-2}, - {0x1.f44p+2, 0x1.d4p+0}, - {0x1.0d8p+1, 0x1.944p+0}, - {0x1.a88p-9, 0x1.61cp-10}, - {0x1.178p+14, 0x1.254p+13}, - {0x1.2cp+15, 0x1.36p+11}, - {0x1.7ap-1, 0x1.95p-4}, - {0x1.adp+14, 0x1.f48p+12}, - {0x1.c2p-2, 0x1.964p-2}, - {0x1.a1p-6, 0x1.38cp-6}, - {0x1.518p+6, 0x1.efp+3}, - {0x1.32p+1, 0x1.fa4p+0}, - {0x1.ccp-11, 0x1.0bcp-11}, - {0x1.96p+14, 0x1.b3p+11}, - {0x1.308p+14, 0x1.fb8p+12}, - {0x1.02p-11, 0x1.3e4p-12}, - {0x1.be4p+1, 0x1.76p+1}, - {0x1.c08p-3, 0x1.b9p-6}, - {0x1.e3p-13, 0x1.928p-14}, - {0x1.218p-2, 0x1.b24p-3}, - {0x1.22p+5, 0x1.1acp+4}, - {0x1.bfp+14, 0x1.4f4p+14}, - {0x1.78p-5, 0x1.284p-6}, - {0x1.ae8p-4, 0x1.4cp-9}, - {0x1.c2p-12, 0x1.be4p-12}, - {0x1.458p+6, 0x1.e84p+5}, - {0x1.efp-14, 0x1.fb8p-15}, - {0x1.cd4p-1, 0x1.1fp-1}, - {0x1.71p+12, 0x1.81p+9}, - {0x1.cbp+4, 0x1.584p+4}, - {0x1.3d8p-1, 0x1.dc4p-2}, - {0x1.c2p+9, 0x1.68cp+9}, - {0x1.128p+1, 0x1.c98p-1}, - {0x1.068p-4, 0x1.7e8p-6}, - {0x1.178p-6, 0x1.a34p-7}, - {0x1.c38p+7, 0x1.784p+6}, - {0x1.158p+6, 0x1.ce8p+4}, - {0x1.e78p-12, 0x1.658p-14}, - {0x1.83p-7, 0x1.7d4p-7}, - {0x1.658p-3, 0x1.7b8p-5}, - {0x1.bd8p+3, 0x1.734p+2}, - {0x1.408p+3, 0x1.e0cp+2}, - {0x1.d1p+5, 0x1.0f4p+4}, - {0x1.848p-9, 0x1.43cp-10}, - {0x1.ccp-8, 0x1.554p-9}, - {0x1.45p+4, 0x1.248p+2}, - {0x1.a5p-10, 0x1.3bcp-10}, - {0x1.65p-4, 0x1.a08p-6}, - {0x1.408p-9, 0x1.e0cp-10}, - {0x1.c38p+3, 0x1.54p-2}, - {0x1.518p+12, 0x1.194p+11}, - {0x1.c2p-11, 0x1.8ecp-11}, - {0x1.d88p-1, 0x1.8fp-4}, - {0x1.268p+6, 0x1.b9cp+5}, - {0x1.74p+11, 0x1.4fcp+10}, - {0x1.188p-2, 0x1.0cp-7}, - {0x1.c7p+8, 0x1.998p+6}, - {0x1.3fp+13, 0x1.11cp+12}, - {0x1.608p-5, 0x1.474p-6}, - {0x1.4ap+4, 0x1.ffp+1}, - {0x1.3bp-13, 0x1.a34p-14}, - {0x1.5f8p+3, 0x1.2cp-2}, - {0x1.58p-5, 0x1.9c8p-7}, - {0x1.f2cp+14, 0x1.56p+13}, - {0x1.988p+3, 0x1.95p+0}, - {0x1.f2cp+13, 0x1.fap+12}, - {0x1.e14p+6, 0x1.a4p+6}, - {0x1.efp-7, 0x1.64p-12}, - {0x1.fbp-8, 0x1.7c4p-8}, - {0x1.95p-4, 0x1.6c8p-6}, - {0x1.68p+9, 0x1.f48p+7}, - {0x1.668p+5, 0x1.2acp+4}, - {0x1.608p+15, 0x1.028p+13}, - {0x1.13p+8, 0x1.47cp+7}, - {0x1.518p-13, 0x1.c38p-15}, - {0x1.5a8p+0, 0x1.adp-3}, - {0x1.f5p-10, 0x1.77cp-10}, - {0x1.05p-5, 0x1.c7p-8}, - {0x1.b3cp-10, 0x1.9fp-10}, - {0x1.488p-13, 0x1.11cp-14}, - {0x1.e3p+2, 0x1.a2cp+2}, - {0x1.8ecp+2, 0x1.5cp+2}, - {0x1.abp-4, 0x1.404p-4}, - {0x1.398p-11, 0x1.71p-14}, - {0x1.c2p-7, 0x1.a9p-10}, - {0x1.d8cp+1, 0x1.59p+1}, - {0x1.848p-2, 0x1.8bp-5}, - {0x1.0ep-5, 0x1.b38p-7}, - {0x1.d9p+14, 0x1.554p+14}, - {0x1.aep+2, 0x1.a34p+1}, - {0x1.d64p+14, 0x1.81p+14}, - {0x1.8a8p+0, 0x1.48cp-1}, - {0x1.308p+3, 0x1.79p+0}, - {0x1.6f8p+3, 0x1.774p+2}, - {0x1.428p+1, 0x1.d9p-2}, - {0x1.108p-5, 0x1.98cp-6}, - {0x1.b9p+11, 0x1.014p+10}, - {0x1.de8p+5, 0x1.0bcp+4}, - {0x1.b6cp-1, 0x1.b5p-1}, - {0x1.cep-6, 0x1.75cp-6}, - {0x1.0f8p+9, 0x1.974p+8}, - {0x1.ee8p+10, 0x1.0bp+7}, - {0x1.2cp+15, 0x1.14cp+14}, - {0x1.5f8p-11, 0x1.2cp-16}, - {0x1.f7cp-13, 0x1.efp-13}, - {0x1.2fp+12, 0x1.618p+10}, - {0x1.0e8p-3, 0x1.95cp-4}, - {0x1.a1p+11, 0x1.38cp+11}, - {0x1.86p-11, 0x1.7c4p-12}, - {0x1.028p+7, 0x1.83cp+6}, - {0x1.f74p+5, 0x1.49p+5}, - {0x1.65p+3, 0x1.c64p+2}, - {0x1.8fp-9, 0x1.7bcp-10}, - {0x1.f14p-5, 0x1.52p-5}, - {0x1.e48p+15, 0x1.214p+14}, - {0x1.fbp+5, 0x1.7c4p+5}, - {0x1.1fp-3, 0x1.c08p-5}, - {0x1.248p+6, 0x1.838p+4}, - {0x1.65p+10, 0x1.fb8p+8}, - {0x1.4c8p-5, 0x1.b6p-9}, - {0x1.a88p+11, 0x1.61cp+10}, - {0x1.458p+5, 0x1.93p+2}, - {0x1.d18p+1, 0x1.de8p-1}, - {0x1.6dp+1, 0x1.488p-1}, - {0x1.698p-5, 0x1.2d4p-6}, - {0x1.3f8p-2, 0x1.df4p-3}, - {0x1.b3p-7, 0x1.878p-9}, - {0x1.1b8p-5, 0x1.02cp-6}, - {0x1.518p-3, 0x1.1dp-6}, - {0x1.198p+2, 0x1.a64p+1}, - {0x1.098p-7, 0x1.ba8p-9}, - {0x1.b3p-8, 0x1.4acp-9}, - {0x1.a28p+4, 0x1.e8cp+3}, - {0x1.41p+13, 0x1.768p+11}, - {0x1.cfp-14, 0x1.5b4p-14}, - {0x1.31p-4, 0x1.128p-6}, - {0x1.83p-2, 0x1.148p-4}, - {0x1.498p+15, 0x1.ee4p+14}, - {0x1.b6cp-3, 0x1.5ep-3}, - {0x1.2a8p+7, 0x1.bfcp+6}, - {0x1.268p-5, 0x1.e3p-8}, - {0x1.7cp-4, 0x1.068p-6}, - {0x1.8fp-4, 0x1.7bcp-5}, - {0x1.95p-9, 0x1.ed8p-11}, - {0x1.29p+2, 0x1.2dcp+1}, - {0x1.dbp-9, 0x1.998p-10}, - {0x1.b1p-10, 0x1.44cp-10}, - {0x1.57p-9, 0x1.944p-10}, - {0x1.138p-9, 0x1.9d4p-10}, - {0x1.d64p-8, 0x1.11p-8}, - {0x1.928p+6, 0x1.bd8p+4}, - {0x1.2a8p+7, 0x1.f18p+5}, - {0x1.95p-6, 0x1.ed8p-8}, - {0x1.998p-9, 0x1.75cp-10}, - {0x1.57p+9, 0x1.944p+8}, - {0x1.998p+11, 0x1.fbp+8}, - {0x1.e3p-7, 0x1.a2cp-7}, - {0x1.efp+8, 0x1.bd8p+6}, - {0x1.d74p+1, 0x1.a7p+1}, - {0x1.f68p-13, 0x1.708p-15}, - {0x1.398p-8, 0x1.93cp-9}, - {0x1.3d8p+1, 0x1.dc4p+0}, - {0x1.efp-1, 0x1.64p-6}, - {0x1.02p-3, 0x1.3e4p-4}, - {0x1.a4p+5, 0x1.ce8p+3}, - {0x1.83p-5, 0x1.148p-7}, - {0x1.adp-9, 0x1.93cp-10}, - {0x1.7e8p-13, 0x1.188p-15}, - {0x1.248p+1, 0x1.838p-1}, - {0x1.adp-10, 0x1.f48p-12}, - {0x1.ecp-2, 0x1.378p-4}, - {0x1.998p-13, 0x1.fbp-16}, - {0x1.dbp-7, 0x1.86p-11}, - {0x1.e3cp-10, 0x1.02p-10}, - {0x1.bfp+2, 0x1.4f4p+2}, - {0x1.adp+7, 0x1.f48p+5}, - {0x1.6f8p+10, 0x1.0d8p+8}, - {0x1.f4p+13, 0x1.e78p+12}, - {0x1.0d8p-9, 0x1.944p-10}, - {0x1.3bp+8, 0x1.1cp+3}, - {0x1.c98p+10, 0x1.4f8p+8}, - {0x1.9fp-10, 0x1.758p-12}, - {0x1.9c8p-4, 0x1.2e8p-6}, - {0x1.d9p-1, 0x1.5cp-6}, - {0x1.ddp+11, 0x1.8d8p+10}, - {0x1.308p-1, 0x1.79p-4}, - {0x1.9bp+12, 0x1.344p+12}, - {0x1.d7p+12, 0x1.12cp+11}, - {0x1.e7p-13, 0x1.6d4p-13}, - {0x1.518p+11, 0x1.bacp+10}, - {0x1.fep+11, 0x1.cbp+9}, - {0x1.e3cp+2, 0x1.02p+2}, - {0x1.098p+0, 0x1.8e4p-1}, - {0x1.538p-10, 0x1.fd4p-11}, - {0x1.858p-3, 0x1.dap-7}, - {0x1.71p-12, 0x1.ae8p-14}, - {0x1.e3p-9, 0x1.34cp-9}, - {0x1.ab8p+13, 0x1.69p+10}, - {0x1.1b8p+3, 0x1.a94p+2}, - {0x1.f14p-12, 0x1.52p-12}, - {0x1.988p+13, 0x1.95p+10}, - {0x1.998p+7, 0x1.e6p+3}, - {0x1.f68p+8, 0x1.708p+6}, - {0x1.81p+15, 0x1.e84p+14}, - {0x1.ae8p+8, 0x1.0a8p+6}, - {0x1.29p+10, 0x1.2dcp+9}, - {0x1.118p-8, 0x1.9a4p-9}, - {0x1.59p+1, 0x1.368p-1}, - {0x1.efp+1, 0x1.9c8p+0}, - {0x1.d7p-9, 0x1.614p-9}, - {0x1.4b8p-5, 0x1.6dp-8}, - {0x1.4c8p-12, 0x1.9c8p-14}, - {0x1.f8p-13, 0x1.158p-14}, - {0x1.41p+10, 0x1.768p+8}, - {0x1.29p-3, 0x1.2dcp-4}, - {0x1.c08p-8, 0x1.75cp-9}, - {0x1.538p-7, 0x1.fd4p-8}, - {0x1.518p-4, 0x1.fa4p-5}, - {0x1.2dp+4, 0x1.62cp+3}, - {0x1.49p-9, 0x1.83cp-10}, - {0x1.6bp+3, 0x1.fap-1}, - {0x1.efp+3, 0x1.734p+3}, - {0x1.038p-5, 0x1.b08p-7}, - {0x1.f3p-3, 0x1.764p-3}, - {0x1.65p-7, 0x1.93cp-8}, - {0x1.73p+13, 0x1.fa4p+12}, - {0x1.a1p+5, 0x1.38cp+5}, - {0x1.9bp-10, 0x1.344p-10}, - {0x1.068p+13, 0x1.1ccp+12}, - {0x1.d38p+15, 0x1.65p+12}, - {0x1.0ep+15, 0x1.074p+14}, - {0x1.b2p+7, 0x1.d1p+4}, - {0x1.0a8p+4, 0x1.f68p+2}, - {0x1.fccp+2, 0x1.bcp+2}, - {0x1.998p-10, 0x1.e6p-14}, - {0x1.83p+10, 0x1.148p+8}, - {0x1.488p+5, 0x1.eccp+4}, - {0x1.e3p-3, 0x1.a2cp-3}, - {0x1.1fp-4, 0x1.524p-5}, - {0x1.428p-3, 0x1.da8p-5}, - {0x1.34p-6, 0x1.d88p-8}, - {0x1.a28p+8, 0x1.e8cp+7}, - {0x1.348p+6, 0x1.cecp+5}, - {0x1.65p+14, 0x1.734p+13}, - {0x1.59p-5, 0x1.928p-7}, - {0x1.068p-11, 0x1.81p-14}, - {0x1.cep+14, 0x1.2b4p+13}, - {0x1.188p+0, 0x1.248p-2}, - {0x1.8bp+9, 0x1.638p+7}, - {0x1.4ap+12, 0x1.bacp+11}, - {0x1.e78p+12, 0x1.e98p+10}, - {0x1.3bp+3, 0x1.1b8p+1}, - {0x1.268p-9, 0x1.e3p-12}, - {0x1.28p-13, 0x1.59p-16}, - {0x1.efp+12, 0x1.814p+12}, - {0x1.7e8p+2, 0x1.3ecp+1}, - {0x1.e1p+15, 0x1.4dcp+14}, - {0x1.1e8p+14, 0x1.dd8p+12}, - {0x1.83p-4, 0x1.7d4p-4}, - {0x1.65p+9, 0x1.734p+8}, - {0x1.72p+11, 0x1.68cp+10}, - {0x1.848p-4, 0x1.43cp-5}, - {0x1.908p+13, 0x1.4dcp+12}, - {0x1.f7cp-9, 0x1.98p-9}, - {0x1.efp+8, 0x1.814p+8}, - {0x1.cf8p+3, 0x1.824p+2}, - {0x1.7cp-12, 0x1.068p-14}, - {0x1.adp-11, 0x1.f48p-13}, - {0x1.a4p+9, 0x1.b2p+5}, - {0x1.178p+12, 0x1.254p+11}, - {0x1.d1p+11, 0x1.a4cp+10}, - {0x1.7b8p+10, 0x1.e8cp+9}, - {0x1.b3p+13, 0x1.464p+13}, - {0x1.a28p+8, 0x1.5ccp+7}, - {0x1.288p+7, 0x1.bccp+6}, - {0x1.bfp+3, 0x1.4f4p+3}, - {0x1.d1p+13, 0x1.a4cp+12}, - {0x1.038p+1, 0x1.b08p-1}, - {0x1.bd8p+7, 0x1.c8cp+6}, - {0x1.bdp+10, 0x1.4dcp+10}, - {0x1.bap-12, 0x1.be4p-13}, - {0x1.efp+4, 0x1.59p+1}, - {0x1.3bp+9, 0x1.1b8p+7}, - {0x1.c7p-10, 0x1.944p-11}, - {0x1.86p+14, 0x1.3cp+9}, - {0x1.26p-11, 0x1.3bp-14}, - {0x1.a9p+2, 0x1.158p+0}, - {0x1.3bp-5, 0x1.734p-6}, - {0x1.6cp+13, 0x1.308p+11}, - {0x1.83p-6, 0x1.7d4p-6}, - {0x1.008p-13, 0x1.658p-15}, - {0x1.b18p+3, 0x1.694p+2}, - {0x1.11p+10, 0x1.41cp+9}, - {0x1.9dp-8, 0x1.e6cp-9}, - {0x1.2dp+3, 0x1.0a4p+2}, - {0x1.5f8p-7, 0x1.2cp-12}, - {0x1.248p-7, 0x1.368p-9}, - {0x1.d7cp+6, 0x1.95p+6}, - {0x1.fep-12, 0x1.4dp-14}, - {0x1.158p-5, 0x1.a04p-6}, - {0x1.378p-10, 0x1.d34p-11}, - {0x1.e7p+10, 0x1.6d4p+10}, - {0x1.208p-9, 0x1.b0cp-10}, - {0x1.c7p-14, 0x1.554p-14}, - {0x1.38p-13, 0x1.f1p-16}, - {0x1.278p+1, 0x1.ec8p-1}, - {0x1.7e8p+13, 0x1.5ep+9}, - {0x1.95p+7, 0x1.6c8p+5}, - {0x1.c2p+11, 0x1.b6cp+10}, - {0x1.fdp-7, 0x1.7dcp-7}, - {0x1.428p+4, 0x1.d9p+1}, - {0x1.ddcp-3, 0x1.dcp-4}, - {0x1.adp+13, 0x1.93cp+12}, - {0x1.e14p-5, 0x1.c2p-6}, - {0x1.608p+5, 0x1.028p+3}, - {0x1.518p+11, 0x1.1dp+8}, - {0x1.f2cp-12, 0x1.dbp-12}, - {0x1.ab8p+9, 0x1.644p+8}, - {0x1.e6p+7, 0x1.cbp+4}, - {0x1.e84p+9, 0x1.d1p+9}, - {0x1.458p-10, 0x1.93p-13}, - {0x1.068p-10, 0x1.81p-13}, - {0x1.59p+0, 0x1.e14p-1}, - {0x1.2e8p+15, 0x1.c5cp+14}, - {0x1.a1p+9, 0x1.38cp+9}, - {0x1.d64p-11, 0x1.11p-11}, - {0x1.488p+0, 0x1.11cp-1}, - {0x1.7ap-13, 0x1.65p-16}, - {0x1.96p-4, 0x1.b3p-7}, - {0x1.8ecp+11, 0x1.5cp+11}, - {0x1.3fp-11, 0x1.11cp-12}, - {0x1.3bp-13, 0x1.ecp-18}, - {0x1.ce8p-8, 0x1.1acp-9}, - {0x1.a28p-13, 0x1.ddcp-14}, - {0x1.488p+4, 0x1.11cp+3}, - {0x1.228p+9, 0x1.b3cp+8}, - {0x1.298p+15, 0x1.14p+10}, - {0x1.ccp+10, 0x1.0bcp+10}, - {0x1.efp+6, 0x1.814p+6}, - {0x1.8d8p+3, 0x1.4b4p+2}, - {0x1.0ep+1, 0x1.6a4p+0}, - {0x1.8f8p+0, 0x1.074p-1}, - {0x1.368p+12, 0x1.02cp+11}, - {0x1.59p-4, 0x1.83p-7}, - {0x1.efp+7, 0x1.848p+6}, - {0x1.998p-5, 0x1.554p-6}, - {0x1.65p+0, 0x1.c64p-1}, - {0x1.29p+8, 0x1.9ep+4}, - {0x1.9ap+3, 0x1.404p+3}, - {0x1.368p-10, 0x1.338p-12}, - {0x1.e3p+0, 0x1.a2cp+0}, - {0x1.8fp+6, 0x1.d64p+5}, - {0x1.5a8p+12, 0x1.3c4p+11}, - {0x1.e48p-7, 0x1.214p-8}, - {0x1.378p-5, 0x1.d34p-6}, - {0x1.ebp-8, 0x1.704p-8}, - {0x1.5a8p+5, 0x1.634p+4}, - {0x1.e3p-9, 0x1.928p-10}, - {0x1.258p+7, 0x1.b84p+6}, - {0x1.5a8p-4, 0x1.20cp-5}, - {0x1.08p-9, 0x1.04p-14}, - {0x1.188p-3, 0x1.0cp-8}, - {0x1.fep-10, 0x1.4dp-12}, - {0x1.4c8p-6, 0x1.f2cp-7}, - {0x1.aep-11, 0x1.a34p-12}, - {0x1.3a8p-7, 0x1.d7cp-8}, - {0x1.fd4p-3, 0x1.e5p-3}, - {0x1.068p+14, 0x1.22p+10}, - {0x1.71p+7, 0x1.81p+4}, - {0x1.1c8p-12, 0x1.aacp-13}, - {0x1.c5p+7, 0x1.084p+6}, - {0x1.dcp-4, 0x1.89cp-4}, - {0x1.7e8p-7, 0x1.b28p-9}, - {0x1.fep+7, 0x1.4dp+5}, - {0x1.068p+9, 0x1.7e8p+7}, - {0x1.59p+7, 0x1.e14p+6}, - {0x1.7ap+12, 0x1.65p+9}, - {0x1.158p-11, 0x1.ce8p-13}, - {0x1.adp+8, 0x1.6dcp+8}, - {0x1.008p+2, 0x1.80cp+1}, - {0x1.4d8p+9, 0x1.3ecp+8}, - {0x1.4b8p+6, 0x1.144p+5}, - {0x1.59p-6, 0x1.e14p-7}, - {0x1.1b8p-9, 0x1.8fcp-10}, - {0x1.b9p+14, 0x1.4acp+14}, - {0x1.378p-13, 0x1.d34p-14}, - {0x1.f2cp+1, 0x1.dcp-1}, - {0x1.be8p-6, 0x1.7e8p-8}, - {0x1.878p+11, 0x1.464p+10}, - {0x1.c9p+12, 0x1.56cp+12}, - {0x1.3e8p-12, 0x1.7ap-16}, - {0x1.7e8p-10, 0x1.b28p-12}, - {0x1.28p+10, 0x1.59p+7}, - {0x1.c2p-11, 0x1.be4p-11}, - {0x1.d4p+1, 0x1.314p+1}, - {0x1.ab8p-12, 0x1.69p-15}, - {0x1.e9p+5, 0x1.978p+4}, - {0x1.3f8p-4, 0x1.df4p-5}, - {0x1.c2p+6, 0x1.26p+2}, - {0x1.5a8p-7, 0x1.3c4p-8}, - {0x1.f2cp-3, 0x1.fap-4}, - {0x1.aa4p-11, 0x1.74p-11}, - {0x1.89cp-10, 0x1.4ap-10}, - {0x1.928p+7, 0x1.a04p+6}, - {0x1.878p-11, 0x1.464p-12}, - {0x1.0b8p+14, 0x1.914p+13}, - {0x1.f2cp-1, 0x1.fap-2}, - {0x1.fep+7, 0x1.6a8p+6}, - {0x1.c08p+10, 0x1.298p+8}, - {0x1.2a8p+13, 0x1.bfcp+12}, - {0x1.d5p+10, 0x1.5fcp+10}, - {0x1.96p+3, 0x1.b3p+0}, - {0x1.f44p-7, 0x1.d4p-9}, - {0x1.efp+3, 0x1.814p+3}, - {0x1.bfp-5, 0x1.4f4p-5}, - {0x1.4c8p+0, 0x1.9c8p-2}, - {0x1.de8p+11, 0x1.0bcp+10}, - {0x1.59p-8, 0x1.83p-11}, - {0x1.028p-5, 0x1.83cp-6}, - {0x1.f8p-10, 0x1.158p-11}, - {0x1.b3p+11, 0x1.464p+11}, - {0x1.1b8p+7, 0x1.a94p+6}, - {0x1.13p+14, 0x1.47cp+13}, - {0x1.e78p+11, 0x1.658p+9}, - {0x1.098p+15, 0x1.ba8p+13}, - {0x1.878p+13, 0x1.464p+12}, - {0x1.4dp+1, 0x1.24p-4}, - {0x1.ab8p+12, 0x1.644p+11}, - {0x1.968p-3, 0x1.52cp-4}, - {0x1.de8p+10, 0x1.0bcp+9}, - {0x1.adp-10, 0x1.a04p-10}, - {0x1.7cp-3, 0x1.734p-3}, - {0x1.b3p-9, 0x1.878p-11}, - {0x1.d18p+9, 0x1.20cp+8}, - {0x1.1b8p-12, 0x1.5fp-15}, - {0x1.81p+12, 0x1.c5cp+11}, - {0x1.13p-8, 0x1.47cp-9}, - {0x1.7e8p+5, 0x1.188p+3}, - {0x1.d9p-5, 0x1.554p-5}, - {0x1.d5p+0, 0x1.5fcp+0}, - {0x1.f7cp-4, 0x1.efp-4}, - {0x1.cdp+1, 0x1.59cp+1}, - {0x1.abp+0, 0x1.f74p-1}, - {0x1.81p-5, 0x1.638p-7}, - {0x1.d8cp+2, 0x1.59p+2}, - {0x1.cep+7, 0x1.75cp+7}, - {0x1.9dp+12, 0x1.35cp+12}, - {0x1.22p-6, 0x1.7b8p-8}, - {0x1.83p+0, 0x1.7d4p+0}, - {0x1.3e8p-11, 0x1.ddcp-12}, - {0x1.a28p+1, 0x1.5ccp+0}, - {0x1.848p-5, 0x1.43cp-6}, - {0x1.f7cp-7, 0x1.efp-7}, - {0x1.d7p+13, 0x1.12cp+12}, - {0x1.d3p+5, 0x1.5e4p+5}, - {0x1.efp-9, 0x1.848p-10}, - {0x1.848p+2, 0x1.43cp+1}, - {0x1.e3p+0, 0x1.928p-1}, - {0x1.098p-8, 0x1.ba8p-10}, - {0x1.d34p-7, 0x1.bdp-7}, - {0x1.3f8p-12, 0x1.0a4p-13}, - {0x1.e3p+7, 0x1.19cp+6}, - {0x1.02p+8, 0x1.3e4p+7}, - {0x1.d9p-9, 0x1.62cp-9}, - {0x1.a28p-7, 0x1.ddcp-8}, - {0x1.c98p+9, 0x1.7d4p+8}, - {0x1.1dp+5, 0x1.008p+3}, - {0x1.9ap+0, 0x1.8fcp-1}, - {0x1.9ep-11, 0x1.1ap-15}, - {0x1.81p-4, 0x1.5a8p-6}, - {0x1.218p+13, 0x1.e28p+11}, - {0x1.608p+6, 0x1.474p+5}, - {0x1.49p+2, 0x1.83cp+1}, - {0x1.258p+1, 0x1.b84p+0}, - {0x1.e14p-8, 0x1.b9p-8}, - {0x1.7f4p-9, 0x1.6dp-9}, - {0x1.76p-9, 0x1.e48p-11}, - {0x1.56p-9, 0x1.428p-11}, - {0x1.57p-12, 0x1.944p-13}, - {0x1.ae8p-9, 0x1.4cp-14}, - {0x1.4dp-10, 0x1.24p-15}, - {0x1.668p+3, 0x1.2acp+2}, - {0x1.238p-11, 0x1.b54p-12}, - {0x1.9dp-11, 0x1.35cp-11}, - {0x1.368p-12, 0x1.d1cp-13}, - {0x1.c5p+10, 0x1.53cp+10}, - {0x1.3bp-7, 0x1.1cp-12}, - {0x1.338p+2, 0x1.cd4p+1}, - {0x1.e3p+13, 0x1.6a4p+13}, - {0x1.cep-2, 0x1.efp-5}, - {0x1.848p+9, 0x1.43cp+8}, - {0x1.998p+14, 0x1.75cp+13}, - {0x1.9f8p-2, 0x1.5a4p-3}, - {0x1.c3p+5, 0x1.2b4p+5}, - {0x1.8fp-2, 0x1.7bcp-3}, - {0x1.3c8p-3, 0x1.07cp-4}, - {0x1.83p+6, 0x1.7d4p+6}, - {0x1.81p+10, 0x1.c5cp+9}, - {0x1.05p+3, 0x1.c7p+0}, - {0x1.098p+14, 0x1.ba8p+12}, - {0x1.28p-11, 0x1.59p-14}, - {0x1.e84p+2, 0x1.d1p+2}, - {0x1.9c8p+14, 0x1.a7p+11}, - {0x1.4e8p+6, 0x1.f5cp+5}, - {0x1.358p-12, 0x1.d04p-13}, - {0x1.158p+9, 0x1.d5p+6}, - {0x1.e78p-6, 0x1.02cp-7}, - {0x1.a1p-9, 0x1.e68p-11}, - {0x1.458p+9, 0x1.e84p+8}, - {0x1.ae8p+9, 0x1.4cp+4}, - {0x1.518p-9, 0x1.194p-10}, - {0x1.79p-12, 0x1.d1cp-13}, - {0x1.068p-3, 0x1.22p-7}, - {0x1.b7p-1, 0x1.494p-1}, - {0x1.fep-5, 0x1.6a8p-6}, - {0x1.b5p+6, 0x1.47cp+6}, - {0x1.de8p-8, 0x1.0bcp-9}, - {0x1.6d8p+4, 0x1.5a8p+2}, - {0x1.878p+14, 0x1.83cp+13}, - {0x1.ba8p-8, 0x1.70cp-9}, - {0x1.bcp-3, 0x1.d38p-5}, - {0x1.a28p+6, 0x1.e8cp+5}, - {0x1.cbp+12, 0x1.464p+11}, - {0x1.13p-11, 0x1.5ccp-12}, - {0x1.1dp+6, 0x1.4c8p+4}, - {0x1.74cp+7, 0x1.63p+7}, - {0x1.eap-13, 0x1.068p-15}, - {0x1.068p+5, 0x1.aa4p+4}, - {0x1.8bp-9, 0x1.638p-11}, - {0x1.e3p-5, 0x1.f38p-6}, - {0x1.abcp+10, 0x1.4ap+10}, - {0x1.9c8p-6, 0x1.3bp-9}, - {0x1.c28p+6, 0x1.9d4p+5}, - {0x1.57p+12, 0x1.944p+11}, - {0x1.34p+1, 0x1.d88p-1}, - {0x1.0ap-13, 0x1.1dp-16}, - {0x1.3e8p+9, 0x1.ddcp+8}, - {0x1.e3p+1, 0x1.19cp+0}, - {0x1.c2p-7, 0x1.8ecp-7}, - {0x1.2dp+12, 0x1.62cp+11}, - {0x1.028p+12, 0x1.af4p+11}, - {0x1.e9p+1, 0x1.1d4p+0}, - {0x1.578p-6, 0x1.1e4p-7}, - {0x1.c28p-13, 0x1.9d4p-14}, - {0x1.188p+7, 0x1.d38p+5}, - {0x1.908p+10, 0x1.4dcp+9}, - {0x1.338p-3, 0x1.cd4p-4}, - {0x1.1d8p+0, 0x1.ac4p-1}, - {0x1.a1p-8, 0x1.e68p-10}, - {0x1.f2cp-9, 0x1.a2p-9}, - {0x1.218p+7, 0x1.e28p+5}, - {0x1.c2p-10, 0x1.964p-10}, - {0x1.f4p+7, 0x1.e78p+6}, - {0x1.cc8p+12, 0x1.7fcp+11}, - {0x1.9dp-3, 0x1.e6cp-4}, - {0x1.4c8p-4, 0x1.e48p-6}, - {0x1.f8p-5, 0x1.324p-5}, - {0x1.cep-2, 0x1.2b4p-3}, - {0x1.838p+12, 0x1.80cp+11}, - {0x1.45p-2, 0x1.248p-4}, - {0x1.ccp-14, 0x1.0bcp-14}, - {0x1.4ap+8, 0x1.ffp+5}, - {0x1.8d8p-5, 0x1.238p-7}, - {0x1.648p+6, 0x1.20cp+5}, - {0x1.b48p-13, 0x1.6bcp-14}, - {0x1.0ep+4, 0x1.fep+0}, - {0x1.458p-7, 0x1.e84p-8}, - {0x1.2b8p+15, 0x1.c14p+14}, - {0x1.4b8p+15, 0x1.e14p+14}, - {0x1.3a8p+0, 0x1.aap-4}, - {0x1.77p-7, 0x1.b58p-9}, - {0x1.83p+14, 0x1.c38p+12}, - {0x1.2a8p-12, 0x1.bfcp-13}, - {0x1.ed8p+8, 0x1.bdp+5}, - {0x1.d58p-10, 0x1.874p-11}, - {0x1.e78p-7, 0x1.e98p-9}, - {0x1.a98p+3, 0x1.758p+1}, - {0x1.038p-10, 0x1.b08p-12}, - {0x1.4c8p-8, 0x1.c8cp-9}, - {0x1.5a8p-2, 0x1.634p-3}, - {0x1.9c8p-11, 0x1.57cp-12}, - {0x1.6a8p-11, 0x1.9ecp-12}, - {0x1.70cp+4, 0x1.65p+4}, - {0x1.a98p+10, 0x1.758p+8}, - {0x1.d28p+15, 0x1.84cp+14}, - {0x1.d64p+4, 0x1.11p+4}, - {0x1.848p+6, 0x1.43cp+5}, - {0x1.c3p-3, 0x1.fep-7}, - {0x1.8fp-6, 0x1.5ecp-6}, - {0x1.ab8p+3, 0x1.69p+0}, - {0x1.028p-2, 0x1.af4p-3}, - {0x1.ccp-2, 0x1.0bcp-2}, - {0x1.c98p-5, 0x1.7d4p-6}, - {0x1.8fp+1, 0x1.d18p-1}, - {0x1.be4p+12, 0x1.76p+12}, - {0x1.a58p-9, 0x1.5f4p-10}, - {0x1.f2cp+6, 0x1.56p+5}, - {0x1.86p+6, 0x1.82cp+6}, - {0x1.458p+7, 0x1.93p+4}, - {0x1.3bp+0, 0x1.644p-1}, - {0x1.9bp+6, 0x1.df8p+4}, - {0x1.b58p+2, 0x1.3ecp+1}, - {0x1.788p+6, 0x1.39cp+5}, - {0x1.068p+5, 0x1.b58p+3}, - {0x1.bcp+9, 0x1.d38p+7}, - {0x1.e14p-13, 0x1.b9p-13}, - {0x1.e6p+5, 0x1.b6cp+5}, - {0x1.cep+13, 0x1.2b4p+12}, - {0x1.908p+1, 0x1.4dcp+0}, - {0x1.e5p-8, 0x1.b48p-10}, - {0x1.d34p+9, 0x1.bdp+9}, - {0x1.4b8p+3, 0x1.e14p+2}, - {0x1.3c8p+2, 0x1.dacp+1}, - {0x1.4dp-5, 0x1.848p-7}, - {0x1.49p-1, 0x1.644p-2}, - {0x1.efp+6, 0x1.fb8p+5}, - {0x1.288p-5, 0x1.bccp-6}, - {0x1.9c8p+2, 0x1.57cp+1}, - {0x1.81p-6, 0x1.c5cp-7}, - {0x1.57p+2, 0x1.944p+1}, - {0x1.4ap-12, 0x1.ffp-15}, - {0x1.1dp-1, 0x1.4c8p-3}, - {0x1.a2p+13, 0x1.89cp+13}, - {0x1.218p-12, 0x1.b24p-13}, - {0x1.3f8p-5, 0x1.0a4p-6}, - {0x1.9ap+15, 0x1.44p+10}, - {0x1.a9p-11, 0x1.7e8p-13}, - {0x1.23p-3, 0x1.538p-5}, - {0x1.59p-10, 0x1.928p-12}, - {0x1.89cp-5, 0x1.77p-5}, - {0x1.c2p-4, 0x1.8ecp-4}, - {0x1.218p-7, 0x1.b24p-8}, - {0x1.ed8p-2, 0x1.bdp-5}, - {0x1.fep-8, 0x1.298p-9}, - {0x1.e78p-2, 0x1.32p-6}, - {0x1.3f8p-2, 0x1.0a4p-3}, - {0x1.bacp-5, 0x1.65p-5}, - {0x1.308p-5, 0x1.e3cp-6}, - {0x1.d1p-12, 0x1.a4cp-13}, - {0x1.368p+1, 0x1.02cp+0}, - {0x1.2d8p-11, 0x1.f68p-13}, - {0x1.9ecp+2, 0x1.8bp+2}, - {0x1.338p+8, 0x1.cd4p+7}, - {0x1.8bp-7, 0x1.638p-9}, - {0x1.d88p+5, 0x1.5a8p+3}, - {0x1.4ap-6, 0x1.ffp-9}, - {0x1.e9p+7, 0x1.978p+6}, - {0x1.128p+1, 0x1.9bcp+0}, - {0x1.56p+8, 0x1.43p+5}, - {0x1.298p+11, 0x1.4acp+10}, - {0x1.368p-10, 0x1.5acp-11}, - {0x1.3a8p-12, 0x1.aap-16}, - {0x1.77p-1, 0x1.b58p-3}, - {0x1.6f8p-10, 0x1.774p-11}, - {0x1.928p+13, 0x1.a04p+12}, - {0x1.f2cp+6, 0x1.dbp+6}, - {0x1.5a8p+7, 0x1.adp+4}, - {0x1.b2p-7, 0x1.d1p-10}, - {0x1.e3cp+9, 0x1.02p+9}, - {0x1.35p-8, 0x1.688p-10}, - {0x1.9dp-4, 0x1.35cp-4}, - {0x1.a4p+14, 0x1.ce8p+12}, - {0x1.d18p+11, 0x1.de8p+9}, - {0x1.318p+6, 0x1.ca4p+5}, - {0x1.298p-3, 0x1.be4p-4}, - {0x1.2cp+0, 0x1.36p-4}, - {0x1.2dp+9, 0x1.0a4p+8}, - {0x1.c08p+12, 0x1.b9p+9}, - {0x1.f7p-1, 0x1.794p-1}, - {0x1.ce8p-4, 0x1.1acp-5}, - {0x1.76p+15, 0x1.e48p+13}, - {0x1.31p+2, 0x1.128p+0}, - {0x1.338p-2, 0x1.868p-4}, - {0x1.e3cp-10, 0x1.2dp-10}, - {0x1.e78p-10, 0x1.02cp-11}, - {0x1.d7p-1, 0x1.12cp-2}, - {0x1.81p-2, 0x1.5a8p-4}, - {0x1.ffp-5, 0x1.7f4p-5}, - {0x1.6f8p-7, 0x1.c7p-10}, - {0x1.f7cp-11, 0x1.98p-11}, - {0x1.b3p+12, 0x1.fb8p+10}, - {0x1.4b8p+12, 0x1.224p+11}, - {0x1.8d8p-13, 0x1.dd4p-14}, - {0x1.e14p+0, 0x1.c2p-1}, - {0x1.248p-2, 0x1.524p-3}, - {0x1.a3p+12, 0x1.3a4p+12}, - {0x1.bdp-11, 0x1.4dcp-11}, - {0x1.418p+0, 0x1.e24p-1}, - {0x1.fep-9, 0x1.6a8p-10}, - {0x1.a98p-8, 0x1.758p-10}, - {0x1.1dp+11, 0x1.0f4p+10}, - {0x1.5a8p+0, 0x1.20cp-1}, - {0x1.f2cp-3, 0x1.0ap-3}, - {0x1.7e8p+15, 0x1.188p+13}, + {0x1.3b8p-5, 0x1.d94p-6}, {0x1.068p-7, 0x1.1ccp-8}, + {0x1.1dp-3, 0x1.4c8p-5}, {0x1.c38p-2, 0x1.784p-3}, + {0x1.e3cp-3, 0x1.02p-3}, {0x1.04p-8, 0x1.b3p-11}, + {0x1.e3p+5, 0x1.928p+4}, {0x1.8bp+4, 0x1.638p+2}, + {0x1.4fp+1, 0x1.2d8p-1}, {0x1.458p+3, 0x1.0f4p+2}, + {0x1.c08p+1, 0x1.75cp+0}, {0x1.1fp-13, 0x1.524p-14}, + {0x1.36p-3, 0x1.2e4p-4}, {0x1.b58p-9, 0x1.3ecp-10}, + {0x1.d74p+6, 0x1.a7p+6}, {0x1.dc4p-6, 0x1.fcp-7}, + {0x1.6f8p-3, 0x1.324p-4}, {0x1.86p+13, 0x1.7c4p+12}, + {0x1.9c8p+4, 0x1.57cp+3}, {0x1.81p+7, 0x1.638p+5}, + {0x1.488p+9, 0x1.11cp+8}, {0x1.0a8p+12, 0x1.f68p+10}, + {0x1.008p-8, 0x1.bcp-13}, {0x1.818p-8, 0x1.414p-9}, + {0x1.efp+1, 0x1.814p+1}, {0x1.b6cp+6, 0x1.11p+6}, + {0x1.458p+10, 0x1.93p+7}, {0x1.058p+13, 0x1.884p+12}, + {0x1.ae8p+7, 0x1.0a8p+5}, {0x1.9c8p+7, 0x1.60cp+6}, + {0x1.2cp+2, 0x1.14cp+1}, {0x1.9bp+13, 0x1.df8p+11}, + {0x1.b2p+14, 0x1.d1p+11}, {0x1.f8p-10, 0x1.d1cp-10}, + {0x1.22p-13, 0x1.7b8p-15}, {0x1.cep-13, 0x1.104p-13}, + {0x1.2e8p+5, 0x1.cep+1}, {0x1.edp-10, 0x1.71cp-10}, + {0x1.6f8p+12, 0x1.96p+8}, {0x1.e78p+7, 0x1.32p+3}, + {0x1.2dp-1, 0x1.62cp-2}, {0x1.ab8p-4, 0x1.72p-8}, + {0x1.ab8p+7, 0x1.398p+5}, {0x1.97p-10, 0x1.1b8p-12}, + {0x1.eap+5, 0x1.068p+3}, {0x1.fdp+11, 0x1.7dcp+11}, + {0x1.fbp-14, 0x1.b04p-14}, {0x1.3bp+14, 0x1.6f8p+12}, + {0x1.4c8p+5, 0x1.c8cp+4}, {0x1.848p-3, 0x1.e1p-6}, + {0x1.72p+4, 0x1.68cp+3}, {0x1.2a8p-10, 0x1.bfcp-11}, + {0x1.d8cp+9, 0x1.59p+9}, {0x1.e3p+12, 0x1.a2cp+12}, + {0x1.81p-8, 0x1.5a8p-10}, {0x1.b48p+3, 0x1.6bcp+2}, + {0x1.14p+8, 0x1.bbcp+7}, {0x1.72p-1, 0x1.cep-5}, + {0x1.068p-3, 0x1.aa4p-4}, {0x1.7b8p+5, 0x1.e8cp+4}, + {0x1.14p-9, 0x1.998p-11}, {0x1.878p+1, 0x1.83cp+0}, + {0x1.068p+5, 0x1.41cp+4}, {0x1.0bp+14, 0x1.378p+12}, + {0x1.2dp-2, 0x1.0a4p-3}, {0x1.ed8p+10, 0x1.bdp+7}, + {0x1.f8p+5, 0x1.158p+4}, {0x1.44p-2, 0x1.62cp-3}, + {0x1.a4p+11, 0x1.ce8p+9}, {0x1.fbp+5, 0x1.45p+2}, + {0x1.1dp+4, 0x1.4c8p+2}, {0x1.2a8p-1, 0x1.f18p-3}, + {0x1.2dp-11, 0x1.0a4p-12}, {0x1.c2p-8, 0x1.b6cp-9}, + {0x1.adp+12, 0x1.41cp+12}, {0x1.9fp+4, 0x1.758p+2}, + {0x1.42p-7, 0x1.59p-10}, {0x1.198p-8, 0x1.a64p-9}, + {0x1.f2cp-2, 0x1.56p-3}, {0x1.e14p-2, 0x1.b9p-2}, + {0x1.158p+7, 0x1.d5p+4}, {0x1.1f8p+7, 0x1.af4p+6}, + {0x1.d88p-6, 0x1.8fp-9}, {0x1.38p-8, 0x1.f1p-11}, + {0x1.3bp-8, 0x1.1cp-13}, {0x1.4a8p-4, 0x1.efcp-5}, + {0x1.efp-2, 0x1.848p-3}, {0x1.cep-1, 0x1.75cp-1}, + {0x1.098p+12, 0x1.ba8p+10}, {0x1.1fp+13, 0x1.c08p+11}, + {0x1.d9p-12, 0x1.5cp-17}, {0x1.89cp+8, 0x1.77p+8}, + {0x1.158p+0, 0x1.97p-3}, {0x1.d7p+1, 0x1.614p+1}, + {0x1.b3p+5, 0x1.878p+3}, {0x1.028p-4, 0x1.af4p-5}, + {0x1.93p-6, 0x1.b3cp-7}, {0x1.4d8p+13, 0x1.f44p+12}, + {0x1.d4cp+5, 0x1.f4p+4}, {0x1.efp-11, 0x1.59p-14}, + {0x1.b6cp+11, 0x1.11p+11}, {0x1.328p+11, 0x1.cbcp+10}, + {0x1.bap+0, 0x1.be4p-1}, {0x1.318p+11, 0x1.ca4p+10}, + {0x1.74cp-13, 0x1.63p-13}, {0x1.3bp+11, 0x1.1b8p+9}, + {0x1.278p-5, 0x1.bb4p-6}, {0x1.1f8p+7, 0x1.74cp+6}, + {0x1.848p-12, 0x1.8bp-15}, {0x1.28p-5, 0x1.59p-8}, + {0x1.9ep+11, 0x1.87p+8}, {0x1.d38p-10, 0x1.e78p-12}, + {0x1.abp-8, 0x1.f74p-9}, {0x1.5fp+12, 0x1.c2p+8}, + {0x1.dbp-13, 0x1.998p-14}, {0x1.0e8p-5, 0x1.95cp-6}, + {0x1.98p+6, 0x1.8a4p+5}, {0x1.998p+0, 0x1.fbp-3}, + {0x1.188p+2, 0x1.d38p+0}, {0x1.efp-5, 0x1.814p-5}, + {0x1.dbp-10, 0x1.464p-10}, {0x1.1a8p-10, 0x1.a7cp-11}, + {0x1.068p-12, 0x1.41cp-13}, {0x1.ba8p-4, 0x1.448p-6}, + {0x1.658p+10, 0x1.89cp+9}, {0x1.9c8p+2, 0x1.2e8p+0}, + {0x1.d88p-12, 0x1.89cp-13}, {0x1.508p+4, 0x1.f8cp+3}, + {0x1.c2p-8, 0x1.be4p-8}, {0x1.d4cp+9, 0x1.f4p+8}, + {0x1.198p+5, 0x1.a64p+4}, {0x1.9ap-5, 0x1.44p-10}, + {0x1.d5p+5, 0x1.5fcp+5}, {0x1.dbp-3, 0x1.ab8p-5}, + {0x1.efp-14, 0x1.3ecp-14}, {0x1.05p+0, 0x1.c7p-3}, + {0x1.c7p+15, 0x1.998p+13}, {0x1.658p+7, 0x1.7b8p+5}, + {0x1.c98p+11, 0x1.7d4p+10}, {0x1.c2p+2, 0x1.a9p-1}, + {0x1.fdp-9, 0x1.7dcp-9}, {0x1.3bp-6, 0x1.6f8p-8}, + {0x1.d18p+3, 0x1.de8p+1}, {0x1.2cp+1, 0x1.36p-3}, + {0x1.458p-4, 0x1.e84p-5}, {0x1.3f8p+8, 0x1.df4p+7}, + {0x1.c2p+1, 0x1.26p-3}, {0x1.e5p+9, 0x1.6bcp+9}, + {0x1.e7p+4, 0x1.6d4p+4}, {0x1.318p-12, 0x1.7f4p-13}, + {0x1.cbp-2, 0x1.0bcp-3}, {0x1.068p-3, 0x1.41cp-4}, + {0x1.55p+10, 0x1.e78p+8}, {0x1.c5cp+14, 0x1.8cp+14}, + {0x1.a28p-1, 0x1.ddcp-2}, {0x1.848p-7, 0x1.43cp-8}, + {0x1.9ecp-6, 0x1.8bp-6}, {0x1.3bp-2, 0x1.364p-3}, + {0x1.c2p+13, 0x1.26p+9}, {0x1.1b8p-13, 0x1.a94p-14}, + {0x1.dbp+11, 0x1.ab8p+9}, {0x1.f3p-13, 0x1.764p-13}, + {0x1.32p+7, 0x1.ae8p+5}, {0x1.2dp-4, 0x1.0a4p-5}, + {0x1.d8cp+7, 0x1.59p+7}, {0x1.05p+1, 0x1.308p-1}, + {0x1.d64p+7, 0x1.11p+7}, {0x1.6f8p+7, 0x1.324p+6}, + {0x1.d88p+8, 0x1.248p+6}, {0x1.008p+5, 0x1.ab8p+3}, + {0x1.248p+4, 0x1.f2cp+3}, {0x1.e5p-11, 0x1.b48p-13}, + {0x1.c2p+7, 0x1.964p+7}, {0x1.fa4p+0, 0x1.3bp+0}, + {0x1.058p-12, 0x1.884p-13}, {0x1.f2p-13, 0x1.228p-14}, + {0x1.c5cp-14, 0x1.8cp-14}, {0x1.cep+4, 0x1.75cp+4}, + {0x1.71p+15, 0x1.81p+12}, {0x1.3bp+12, 0x1.644p+11}, + {0x1.188p-8, 0x1.0cp-13}, {0x1.2fp+9, 0x1.618p+7}, + {0x1.088p+11, 0x1.8ccp+10}, {0x1.c3p+9, 0x1.524p+9}, + {0x1.f2cp+8, 0x1.44p+8}, {0x1.11p-7, 0x1.34cp-8}, + {0x1.efp+9, 0x1.848p+8}, {0x1.fa4p+11, 0x1.0ep+11}, + {0x1.3e8p-7, 0x1.ddcp-8}, {0x1.288p-13, 0x1.bccp-14}, + {0x1.518p-8, 0x1.fa4p-9}, {0x1.c7p-3, 0x1.944p-4}, + {0x1.338p+3, 0x1.c3p+0}, {0x1.1b8p+14, 0x1.d88p+12}, + {0x1.d7p-5, 0x1.614p-5}, {0x1.9ep+6, 0x1.87p+3}, + {0x1.e9p+13, 0x1.6ecp+13}, {0x1.9dp-3, 0x1.35cp-3}, + {0x1.318p+13, 0x1.ca4p+12}, {0x1.11p+1, 0x1.cd4p+0}, + {0x1.26p-10, 0x1.3bp-13}, {0x1.adp+14, 0x1.13p+11}, + {0x1.9bcp-7, 0x1.76p-7}, {0x1.e6p-10, 0x1.cbp-13}, + {0x1.dbp-2, 0x1.86p-6}, {0x1.f2cp+3, 0x1.dbp+3}, + {0x1.2a8p+3, 0x1.bfcp+2}, {0x1.f2cp+14, 0x1.0ap+14}, + {0x1.5cp+13, 0x1.b6cp+12}, {0x1.3d8p+3, 0x1.dc4p+2}, + {0x1.0b8p-10, 0x1.914p-11}, {0x1.5cp+3, 0x1.6dcp+2}, + {0x1.ba8p+0, 0x1.70cp-1}, {0x1.45p-2, 0x1.20cp-3}, + {0x1.ab8p+5, 0x1.72p+1}, {0x1.dbp-13, 0x1.86p-17}, + {0x1.aep-9, 0x1.6a4p-9}, {0x1.298p-13, 0x1.14p-18}, + {0x1.0f8p-10, 0x1.974p-11}, {0x1.ddp+1, 0x1.65cp+1}, + {0x1.d88p-6, 0x1.5a8p-8}, {0x1.08p-4, 0x1.04p-9}, + {0x1.318p-1, 0x1.ca4p-2}, {0x1.45p-8, 0x1.248p-10}, + {0x1.068p+14, 0x1.1ccp+13}, {0x1.468p+13, 0x1.e9cp+12}, + {0x1.aa4p-9, 0x1.74p-9}, {0x1.02p+3, 0x1.3e4p+2}, + {0x1.6bp-11, 0x1.a78p-13}, {0x1.158p-5, 0x1.d5p-8}, + {0x1.0f8p-4, 0x1.974p-5}, {0x1.1ep-1, 0x1.728p-3}, + {0x1.a9p+8, 0x1.7e8p+6}, {0x1.86p+13, 0x1.3cp+8}, + {0x1.c2p+6, 0x1.8ecp+6}, {0x1.238p-4, 0x1.b54p-5}, + {0x1.3bp-13, 0x1.734p-14}, {0x1.aep-3, 0x1.f2p-7}, + {0x1.2cp+7, 0x1.36p+3}, {0x1.70cp+13, 0x1.65p+13}, + {0x1.ed8p-9, 0x1.bdp-12}, {0x1.188p+15, 0x1.248p+13}, + {0x1.5ep+15, 0x1.77p+12}, {0x1.bd8p-8, 0x1.6f8p-10}, + {0x1.e78p+8, 0x1.32p+4}, {0x1.c38p-8, 0x1.784p-9}, + {0x1.008p+5, 0x1.658p+3}, {0x1.6f8p-9, 0x1.0d8p-11}, + {0x1.9c8p-13, 0x1.2e8p-15}, {0x1.4f8p+15, 0x1.f74p+14}, + {0x1.158p+11, 0x1.d5p+8}, {0x1.9c8p-3, 0x1.57cp-4}, + {0x1.0c8p+15, 0x1.bf8p+13}, {0x1.5a8p-3, 0x1.518p-5}, + {0x1.e84p+7, 0x1.d1p+7}, {0x1.abp-12, 0x1.f74p-13}, + {0x1.1ep+13, 0x1.728p+11}, {0x1.8cp-3, 0x1.e14p-4}, + {0x1.6d8p+7, 0x1.5a8p+5}, {0x1.e9p-13, 0x1.6ecp-13}, + {0x1.7e8p+10, 0x1.188p+8}, {0x1.17p+10, 0x1.f7cp+9}, + {0x1.dfp-8, 0x1.674p-8}, {0x1.d34p+5, 0x1.bdp+5}, + {0x1.018p-2, 0x1.824p-3}, {0x1.6f8p-13, 0x1.c7p-16}, + {0x1.a58p+11, 0x1.5f4p+10}, {0x1.e3cp+3, 0x1.02p+3}, + {0x1.cbp-5, 0x1.584p-5}, {0x1.5a8p+9, 0x1.3c4p+8}, + {0x1.528p-8, 0x1.fbcp-9}, {0x1.1b8p+9, 0x1.a94p+8}, + {0x1.788p-7, 0x1.39cp-8}, {0x1.f2cp+4, 0x1.56p+3}, + {0x1.f2cp+2, 0x1.fap+1}, {0x1.218p+5, 0x1.b24p+4}, + {0x1.fbp+4, 0x1.7c4p+4}, {0x1.45p-3, 0x1.20cp-4}, + {0x1.368p+12, 0x1.338p+10}, {0x1.1ep-3, 0x1.20cp-4}, + {0x1.c5p+6, 0x1.084p+5}, {0x1.afp+12, 0x1.434p+12}, + {0x1.bfp-3, 0x1.4f4p-3}, {0x1.d4p+8, 0x1.d88p+7}, + {0x1.e3cp-5, 0x1.02p-5}, {0x1.adp+9, 0x1.6dcp+9}, + {0x1.b8p+3, 0x1.f44p+2}, {0x1.ddcp+7, 0x1.c7p+7}, + {0x1.248p-10, 0x1.e78p-12}, {0x1.efp+13, 0x1.9c8p+12}, + {0x1.a2p+5, 0x1.89cp+5}, {0x1.298p+8, 0x1.be4p+7}, + {0x1.0f8p-12, 0x1.974p-13}, {0x1.dcp-8, 0x1.cep-12}, + {0x1.c38p+0, 0x1.784p-1}, {0x1.038p+11, 0x1.854p+10}, + {0x1.b3cp+11, 0x1.9fp+11}, {0x1.5fp-4, 0x1.c2p-8}, + {0x1.c7p+2, 0x1.554p+2}, {0x1.c38p-12, 0x1.178p-14}, + {0x1.f14p+2, 0x1.cep+2}, {0x1.3e8p-13, 0x1.ddcp-14}, + {0x1.188p+12, 0x1.248p+10}, {0x1.b04p-13, 0x1.1dp-13}, + {0x1.c5cp-7, 0x1.8cp-7}, {0x1.22p-11, 0x1.7b8p-13}, + {0x1.338p+0, 0x1.868p-2}, {0x1.f44p+2, 0x1.d4p+0}, + {0x1.0d8p+1, 0x1.944p+0}, {0x1.a88p-9, 0x1.61cp-10}, + {0x1.178p+14, 0x1.254p+13}, {0x1.2cp+15, 0x1.36p+11}, + {0x1.7ap-1, 0x1.95p-4}, {0x1.adp+14, 0x1.f48p+12}, + {0x1.c2p-2, 0x1.964p-2}, {0x1.a1p-6, 0x1.38cp-6}, + {0x1.518p+6, 0x1.efp+3}, {0x1.32p+1, 0x1.fa4p+0}, + {0x1.ccp-11, 0x1.0bcp-11}, {0x1.96p+14, 0x1.b3p+11}, + {0x1.308p+14, 0x1.fb8p+12}, {0x1.02p-11, 0x1.3e4p-12}, + {0x1.be4p+1, 0x1.76p+1}, {0x1.c08p-3, 0x1.b9p-6}, + {0x1.e3p-13, 0x1.928p-14}, {0x1.218p-2, 0x1.b24p-3}, + {0x1.22p+5, 0x1.1acp+4}, {0x1.bfp+14, 0x1.4f4p+14}, + {0x1.78p-5, 0x1.284p-6}, {0x1.ae8p-4, 0x1.4cp-9}, + {0x1.c2p-12, 0x1.be4p-12}, {0x1.458p+6, 0x1.e84p+5}, + {0x1.efp-14, 0x1.fb8p-15}, {0x1.cd4p-1, 0x1.1fp-1}, + {0x1.71p+12, 0x1.81p+9}, {0x1.cbp+4, 0x1.584p+4}, + {0x1.3d8p-1, 0x1.dc4p-2}, {0x1.c2p+9, 0x1.68cp+9}, + {0x1.128p+1, 0x1.c98p-1}, {0x1.068p-4, 0x1.7e8p-6}, + {0x1.178p-6, 0x1.a34p-7}, {0x1.c38p+7, 0x1.784p+6}, + {0x1.158p+6, 0x1.ce8p+4}, {0x1.e78p-12, 0x1.658p-14}, + {0x1.83p-7, 0x1.7d4p-7}, {0x1.658p-3, 0x1.7b8p-5}, + {0x1.bd8p+3, 0x1.734p+2}, {0x1.408p+3, 0x1.e0cp+2}, + {0x1.d1p+5, 0x1.0f4p+4}, {0x1.848p-9, 0x1.43cp-10}, + {0x1.ccp-8, 0x1.554p-9}, {0x1.45p+4, 0x1.248p+2}, + {0x1.a5p-10, 0x1.3bcp-10}, {0x1.65p-4, 0x1.a08p-6}, + {0x1.408p-9, 0x1.e0cp-10}, {0x1.c38p+3, 0x1.54p-2}, + {0x1.518p+12, 0x1.194p+11}, {0x1.c2p-11, 0x1.8ecp-11}, + {0x1.d88p-1, 0x1.8fp-4}, {0x1.268p+6, 0x1.b9cp+5}, + {0x1.74p+11, 0x1.4fcp+10}, {0x1.188p-2, 0x1.0cp-7}, + {0x1.c7p+8, 0x1.998p+6}, {0x1.3fp+13, 0x1.11cp+12}, + {0x1.608p-5, 0x1.474p-6}, {0x1.4ap+4, 0x1.ffp+1}, + {0x1.3bp-13, 0x1.a34p-14}, {0x1.5f8p+3, 0x1.2cp-2}, + {0x1.58p-5, 0x1.9c8p-7}, {0x1.f2cp+14, 0x1.56p+13}, + {0x1.988p+3, 0x1.95p+0}, {0x1.f2cp+13, 0x1.fap+12}, + {0x1.e14p+6, 0x1.a4p+6}, {0x1.efp-7, 0x1.64p-12}, + {0x1.fbp-8, 0x1.7c4p-8}, {0x1.95p-4, 0x1.6c8p-6}, + {0x1.68p+9, 0x1.f48p+7}, {0x1.668p+5, 0x1.2acp+4}, + {0x1.608p+15, 0x1.028p+13}, {0x1.13p+8, 0x1.47cp+7}, + {0x1.518p-13, 0x1.c38p-15}, {0x1.5a8p+0, 0x1.adp-3}, + {0x1.f5p-10, 0x1.77cp-10}, {0x1.05p-5, 0x1.c7p-8}, + {0x1.b3cp-10, 0x1.9fp-10}, {0x1.488p-13, 0x1.11cp-14}, + {0x1.e3p+2, 0x1.a2cp+2}, {0x1.8ecp+2, 0x1.5cp+2}, + {0x1.abp-4, 0x1.404p-4}, {0x1.398p-11, 0x1.71p-14}, + {0x1.c2p-7, 0x1.a9p-10}, {0x1.d8cp+1, 0x1.59p+1}, + {0x1.848p-2, 0x1.8bp-5}, {0x1.0ep-5, 0x1.b38p-7}, + {0x1.d9p+14, 0x1.554p+14}, {0x1.aep+2, 0x1.a34p+1}, + {0x1.d64p+14, 0x1.81p+14}, {0x1.8a8p+0, 0x1.48cp-1}, + {0x1.308p+3, 0x1.79p+0}, {0x1.6f8p+3, 0x1.774p+2}, + {0x1.428p+1, 0x1.d9p-2}, {0x1.108p-5, 0x1.98cp-6}, + {0x1.b9p+11, 0x1.014p+10}, {0x1.de8p+5, 0x1.0bcp+4}, + {0x1.b6cp-1, 0x1.b5p-1}, {0x1.cep-6, 0x1.75cp-6}, + {0x1.0f8p+9, 0x1.974p+8}, {0x1.ee8p+10, 0x1.0bp+7}, + {0x1.2cp+15, 0x1.14cp+14}, {0x1.5f8p-11, 0x1.2cp-16}, + {0x1.f7cp-13, 0x1.efp-13}, {0x1.2fp+12, 0x1.618p+10}, + {0x1.0e8p-3, 0x1.95cp-4}, {0x1.a1p+11, 0x1.38cp+11}, + {0x1.86p-11, 0x1.7c4p-12}, {0x1.028p+7, 0x1.83cp+6}, + {0x1.f74p+5, 0x1.49p+5}, {0x1.65p+3, 0x1.c64p+2}, + {0x1.8fp-9, 0x1.7bcp-10}, {0x1.f14p-5, 0x1.52p-5}, + {0x1.e48p+15, 0x1.214p+14}, {0x1.fbp+5, 0x1.7c4p+5}, + {0x1.1fp-3, 0x1.c08p-5}, {0x1.248p+6, 0x1.838p+4}, + {0x1.65p+10, 0x1.fb8p+8}, {0x1.4c8p-5, 0x1.b6p-9}, + {0x1.a88p+11, 0x1.61cp+10}, {0x1.458p+5, 0x1.93p+2}, + {0x1.d18p+1, 0x1.de8p-1}, {0x1.6dp+1, 0x1.488p-1}, + {0x1.698p-5, 0x1.2d4p-6}, {0x1.3f8p-2, 0x1.df4p-3}, + {0x1.b3p-7, 0x1.878p-9}, {0x1.1b8p-5, 0x1.02cp-6}, + {0x1.518p-3, 0x1.1dp-6}, {0x1.198p+2, 0x1.a64p+1}, + {0x1.098p-7, 0x1.ba8p-9}, {0x1.b3p-8, 0x1.4acp-9}, + {0x1.a28p+4, 0x1.e8cp+3}, {0x1.41p+13, 0x1.768p+11}, + {0x1.cfp-14, 0x1.5b4p-14}, {0x1.31p-4, 0x1.128p-6}, + {0x1.83p-2, 0x1.148p-4}, {0x1.498p+15, 0x1.ee4p+14}, + {0x1.b6cp-3, 0x1.5ep-3}, {0x1.2a8p+7, 0x1.bfcp+6}, + {0x1.268p-5, 0x1.e3p-8}, {0x1.7cp-4, 0x1.068p-6}, + {0x1.8fp-4, 0x1.7bcp-5}, {0x1.95p-9, 0x1.ed8p-11}, + {0x1.29p+2, 0x1.2dcp+1}, {0x1.dbp-9, 0x1.998p-10}, + {0x1.b1p-10, 0x1.44cp-10}, {0x1.57p-9, 0x1.944p-10}, + {0x1.138p-9, 0x1.9d4p-10}, {0x1.d64p-8, 0x1.11p-8}, + {0x1.928p+6, 0x1.bd8p+4}, {0x1.2a8p+7, 0x1.f18p+5}, + {0x1.95p-6, 0x1.ed8p-8}, {0x1.998p-9, 0x1.75cp-10}, + {0x1.57p+9, 0x1.944p+8}, {0x1.998p+11, 0x1.fbp+8}, + {0x1.e3p-7, 0x1.a2cp-7}, {0x1.efp+8, 0x1.bd8p+6}, + {0x1.d74p+1, 0x1.a7p+1}, {0x1.f68p-13, 0x1.708p-15}, + {0x1.398p-8, 0x1.93cp-9}, {0x1.3d8p+1, 0x1.dc4p+0}, + {0x1.efp-1, 0x1.64p-6}, {0x1.02p-3, 0x1.3e4p-4}, + {0x1.a4p+5, 0x1.ce8p+3}, {0x1.83p-5, 0x1.148p-7}, + {0x1.adp-9, 0x1.93cp-10}, {0x1.7e8p-13, 0x1.188p-15}, + {0x1.248p+1, 0x1.838p-1}, {0x1.adp-10, 0x1.f48p-12}, + {0x1.ecp-2, 0x1.378p-4}, {0x1.998p-13, 0x1.fbp-16}, + {0x1.dbp-7, 0x1.86p-11}, {0x1.e3cp-10, 0x1.02p-10}, + {0x1.bfp+2, 0x1.4f4p+2}, {0x1.adp+7, 0x1.f48p+5}, + {0x1.6f8p+10, 0x1.0d8p+8}, {0x1.f4p+13, 0x1.e78p+12}, + {0x1.0d8p-9, 0x1.944p-10}, {0x1.3bp+8, 0x1.1cp+3}, + {0x1.c98p+10, 0x1.4f8p+8}, {0x1.9fp-10, 0x1.758p-12}, + {0x1.9c8p-4, 0x1.2e8p-6}, {0x1.d9p-1, 0x1.5cp-6}, + {0x1.ddp+11, 0x1.8d8p+10}, {0x1.308p-1, 0x1.79p-4}, + {0x1.9bp+12, 0x1.344p+12}, {0x1.d7p+12, 0x1.12cp+11}, + {0x1.e7p-13, 0x1.6d4p-13}, {0x1.518p+11, 0x1.bacp+10}, + {0x1.fep+11, 0x1.cbp+9}, {0x1.e3cp+2, 0x1.02p+2}, + {0x1.098p+0, 0x1.8e4p-1}, {0x1.538p-10, 0x1.fd4p-11}, + {0x1.858p-3, 0x1.dap-7}, {0x1.71p-12, 0x1.ae8p-14}, + {0x1.e3p-9, 0x1.34cp-9}, {0x1.ab8p+13, 0x1.69p+10}, + {0x1.1b8p+3, 0x1.a94p+2}, {0x1.f14p-12, 0x1.52p-12}, + {0x1.988p+13, 0x1.95p+10}, {0x1.998p+7, 0x1.e6p+3}, + {0x1.f68p+8, 0x1.708p+6}, {0x1.81p+15, 0x1.e84p+14}, + {0x1.ae8p+8, 0x1.0a8p+6}, {0x1.29p+10, 0x1.2dcp+9}, + {0x1.118p-8, 0x1.9a4p-9}, {0x1.59p+1, 0x1.368p-1}, + {0x1.efp+1, 0x1.9c8p+0}, {0x1.d7p-9, 0x1.614p-9}, + {0x1.4b8p-5, 0x1.6dp-8}, {0x1.4c8p-12, 0x1.9c8p-14}, + {0x1.f8p-13, 0x1.158p-14}, {0x1.41p+10, 0x1.768p+8}, + {0x1.29p-3, 0x1.2dcp-4}, {0x1.c08p-8, 0x1.75cp-9}, + {0x1.538p-7, 0x1.fd4p-8}, {0x1.518p-4, 0x1.fa4p-5}, + {0x1.2dp+4, 0x1.62cp+3}, {0x1.49p-9, 0x1.83cp-10}, + {0x1.6bp+3, 0x1.fap-1}, {0x1.efp+3, 0x1.734p+3}, + {0x1.038p-5, 0x1.b08p-7}, {0x1.f3p-3, 0x1.764p-3}, + {0x1.65p-7, 0x1.93cp-8}, {0x1.73p+13, 0x1.fa4p+12}, + {0x1.a1p+5, 0x1.38cp+5}, {0x1.9bp-10, 0x1.344p-10}, + {0x1.068p+13, 0x1.1ccp+12}, {0x1.d38p+15, 0x1.65p+12}, + {0x1.0ep+15, 0x1.074p+14}, {0x1.b2p+7, 0x1.d1p+4}, + {0x1.0a8p+4, 0x1.f68p+2}, {0x1.fccp+2, 0x1.bcp+2}, + {0x1.998p-10, 0x1.e6p-14}, {0x1.83p+10, 0x1.148p+8}, + {0x1.488p+5, 0x1.eccp+4}, {0x1.e3p-3, 0x1.a2cp-3}, + {0x1.1fp-4, 0x1.524p-5}, {0x1.428p-3, 0x1.da8p-5}, + {0x1.34p-6, 0x1.d88p-8}, {0x1.a28p+8, 0x1.e8cp+7}, + {0x1.348p+6, 0x1.cecp+5}, {0x1.65p+14, 0x1.734p+13}, + {0x1.59p-5, 0x1.928p-7}, {0x1.068p-11, 0x1.81p-14}, + {0x1.cep+14, 0x1.2b4p+13}, {0x1.188p+0, 0x1.248p-2}, + {0x1.8bp+9, 0x1.638p+7}, {0x1.4ap+12, 0x1.bacp+11}, + {0x1.e78p+12, 0x1.e98p+10}, {0x1.3bp+3, 0x1.1b8p+1}, + {0x1.268p-9, 0x1.e3p-12}, {0x1.28p-13, 0x1.59p-16}, + {0x1.efp+12, 0x1.814p+12}, {0x1.7e8p+2, 0x1.3ecp+1}, + {0x1.e1p+15, 0x1.4dcp+14}, {0x1.1e8p+14, 0x1.dd8p+12}, + {0x1.83p-4, 0x1.7d4p-4}, {0x1.65p+9, 0x1.734p+8}, + {0x1.72p+11, 0x1.68cp+10}, {0x1.848p-4, 0x1.43cp-5}, + {0x1.908p+13, 0x1.4dcp+12}, {0x1.f7cp-9, 0x1.98p-9}, + {0x1.efp+8, 0x1.814p+8}, {0x1.cf8p+3, 0x1.824p+2}, + {0x1.7cp-12, 0x1.068p-14}, {0x1.adp-11, 0x1.f48p-13}, + {0x1.a4p+9, 0x1.b2p+5}, {0x1.178p+12, 0x1.254p+11}, + {0x1.d1p+11, 0x1.a4cp+10}, {0x1.7b8p+10, 0x1.e8cp+9}, + {0x1.b3p+13, 0x1.464p+13}, {0x1.a28p+8, 0x1.5ccp+7}, + {0x1.288p+7, 0x1.bccp+6}, {0x1.bfp+3, 0x1.4f4p+3}, + {0x1.d1p+13, 0x1.a4cp+12}, {0x1.038p+1, 0x1.b08p-1}, + {0x1.bd8p+7, 0x1.c8cp+6}, {0x1.bdp+10, 0x1.4dcp+10}, + {0x1.bap-12, 0x1.be4p-13}, {0x1.efp+4, 0x1.59p+1}, + {0x1.3bp+9, 0x1.1b8p+7}, {0x1.c7p-10, 0x1.944p-11}, + {0x1.86p+14, 0x1.3cp+9}, {0x1.26p-11, 0x1.3bp-14}, + {0x1.a9p+2, 0x1.158p+0}, {0x1.3bp-5, 0x1.734p-6}, + {0x1.6cp+13, 0x1.308p+11}, {0x1.83p-6, 0x1.7d4p-6}, + {0x1.008p-13, 0x1.658p-15}, {0x1.b18p+3, 0x1.694p+2}, + {0x1.11p+10, 0x1.41cp+9}, {0x1.9dp-8, 0x1.e6cp-9}, + {0x1.2dp+3, 0x1.0a4p+2}, {0x1.5f8p-7, 0x1.2cp-12}, + {0x1.248p-7, 0x1.368p-9}, {0x1.d7cp+6, 0x1.95p+6}, + {0x1.fep-12, 0x1.4dp-14}, {0x1.158p-5, 0x1.a04p-6}, + {0x1.378p-10, 0x1.d34p-11}, {0x1.e7p+10, 0x1.6d4p+10}, + {0x1.208p-9, 0x1.b0cp-10}, {0x1.c7p-14, 0x1.554p-14}, + {0x1.38p-13, 0x1.f1p-16}, {0x1.278p+1, 0x1.ec8p-1}, + {0x1.7e8p+13, 0x1.5ep+9}, {0x1.95p+7, 0x1.6c8p+5}, + {0x1.c2p+11, 0x1.b6cp+10}, {0x1.fdp-7, 0x1.7dcp-7}, + {0x1.428p+4, 0x1.d9p+1}, {0x1.ddcp-3, 0x1.dcp-4}, + {0x1.adp+13, 0x1.93cp+12}, {0x1.e14p-5, 0x1.c2p-6}, + {0x1.608p+5, 0x1.028p+3}, {0x1.518p+11, 0x1.1dp+8}, + {0x1.f2cp-12, 0x1.dbp-12}, {0x1.ab8p+9, 0x1.644p+8}, + {0x1.e6p+7, 0x1.cbp+4}, {0x1.e84p+9, 0x1.d1p+9}, + {0x1.458p-10, 0x1.93p-13}, {0x1.068p-10, 0x1.81p-13}, + {0x1.59p+0, 0x1.e14p-1}, {0x1.2e8p+15, 0x1.c5cp+14}, + {0x1.a1p+9, 0x1.38cp+9}, {0x1.d64p-11, 0x1.11p-11}, + {0x1.488p+0, 0x1.11cp-1}, {0x1.7ap-13, 0x1.65p-16}, + {0x1.96p-4, 0x1.b3p-7}, {0x1.8ecp+11, 0x1.5cp+11}, + {0x1.3fp-11, 0x1.11cp-12}, {0x1.3bp-13, 0x1.ecp-18}, + {0x1.ce8p-8, 0x1.1acp-9}, {0x1.a28p-13, 0x1.ddcp-14}, + {0x1.488p+4, 0x1.11cp+3}, {0x1.228p+9, 0x1.b3cp+8}, + {0x1.298p+15, 0x1.14p+10}, {0x1.ccp+10, 0x1.0bcp+10}, + {0x1.efp+6, 0x1.814p+6}, {0x1.8d8p+3, 0x1.4b4p+2}, + {0x1.0ep+1, 0x1.6a4p+0}, {0x1.8f8p+0, 0x1.074p-1}, + {0x1.368p+12, 0x1.02cp+11}, {0x1.59p-4, 0x1.83p-7}, + {0x1.efp+7, 0x1.848p+6}, {0x1.998p-5, 0x1.554p-6}, + {0x1.65p+0, 0x1.c64p-1}, {0x1.29p+8, 0x1.9ep+4}, + {0x1.9ap+3, 0x1.404p+3}, {0x1.368p-10, 0x1.338p-12}, + {0x1.e3p+0, 0x1.a2cp+0}, {0x1.8fp+6, 0x1.d64p+5}, + {0x1.5a8p+12, 0x1.3c4p+11}, {0x1.e48p-7, 0x1.214p-8}, + {0x1.378p-5, 0x1.d34p-6}, {0x1.ebp-8, 0x1.704p-8}, + {0x1.5a8p+5, 0x1.634p+4}, {0x1.e3p-9, 0x1.928p-10}, + {0x1.258p+7, 0x1.b84p+6}, {0x1.5a8p-4, 0x1.20cp-5}, + {0x1.08p-9, 0x1.04p-14}, {0x1.188p-3, 0x1.0cp-8}, + {0x1.fep-10, 0x1.4dp-12}, {0x1.4c8p-6, 0x1.f2cp-7}, + {0x1.aep-11, 0x1.a34p-12}, {0x1.3a8p-7, 0x1.d7cp-8}, + {0x1.fd4p-3, 0x1.e5p-3}, {0x1.068p+14, 0x1.22p+10}, + {0x1.71p+7, 0x1.81p+4}, {0x1.1c8p-12, 0x1.aacp-13}, + {0x1.c5p+7, 0x1.084p+6}, {0x1.dcp-4, 0x1.89cp-4}, + {0x1.7e8p-7, 0x1.b28p-9}, {0x1.fep+7, 0x1.4dp+5}, + {0x1.068p+9, 0x1.7e8p+7}, {0x1.59p+7, 0x1.e14p+6}, + {0x1.7ap+12, 0x1.65p+9}, {0x1.158p-11, 0x1.ce8p-13}, + {0x1.adp+8, 0x1.6dcp+8}, {0x1.008p+2, 0x1.80cp+1}, + {0x1.4d8p+9, 0x1.3ecp+8}, {0x1.4b8p+6, 0x1.144p+5}, + {0x1.59p-6, 0x1.e14p-7}, {0x1.1b8p-9, 0x1.8fcp-10}, + {0x1.b9p+14, 0x1.4acp+14}, {0x1.378p-13, 0x1.d34p-14}, + {0x1.f2cp+1, 0x1.dcp-1}, {0x1.be8p-6, 0x1.7e8p-8}, + {0x1.878p+11, 0x1.464p+10}, {0x1.c9p+12, 0x1.56cp+12}, + {0x1.3e8p-12, 0x1.7ap-16}, {0x1.7e8p-10, 0x1.b28p-12}, + {0x1.28p+10, 0x1.59p+7}, {0x1.c2p-11, 0x1.be4p-11}, + {0x1.d4p+1, 0x1.314p+1}, {0x1.ab8p-12, 0x1.69p-15}, + {0x1.e9p+5, 0x1.978p+4}, {0x1.3f8p-4, 0x1.df4p-5}, + {0x1.c2p+6, 0x1.26p+2}, {0x1.5a8p-7, 0x1.3c4p-8}, + {0x1.f2cp-3, 0x1.fap-4}, {0x1.aa4p-11, 0x1.74p-11}, + {0x1.89cp-10, 0x1.4ap-10}, {0x1.928p+7, 0x1.a04p+6}, + {0x1.878p-11, 0x1.464p-12}, {0x1.0b8p+14, 0x1.914p+13}, + {0x1.f2cp-1, 0x1.fap-2}, {0x1.fep+7, 0x1.6a8p+6}, + {0x1.c08p+10, 0x1.298p+8}, {0x1.2a8p+13, 0x1.bfcp+12}, + {0x1.d5p+10, 0x1.5fcp+10}, {0x1.96p+3, 0x1.b3p+0}, + {0x1.f44p-7, 0x1.d4p-9}, {0x1.efp+3, 0x1.814p+3}, + {0x1.bfp-5, 0x1.4f4p-5}, {0x1.4c8p+0, 0x1.9c8p-2}, + {0x1.de8p+11, 0x1.0bcp+10}, {0x1.59p-8, 0x1.83p-11}, + {0x1.028p-5, 0x1.83cp-6}, {0x1.f8p-10, 0x1.158p-11}, + {0x1.b3p+11, 0x1.464p+11}, {0x1.1b8p+7, 0x1.a94p+6}, + {0x1.13p+14, 0x1.47cp+13}, {0x1.e78p+11, 0x1.658p+9}, + {0x1.098p+15, 0x1.ba8p+13}, {0x1.878p+13, 0x1.464p+12}, + {0x1.4dp+1, 0x1.24p-4}, {0x1.ab8p+12, 0x1.644p+11}, + {0x1.968p-3, 0x1.52cp-4}, {0x1.de8p+10, 0x1.0bcp+9}, + {0x1.adp-10, 0x1.a04p-10}, {0x1.7cp-3, 0x1.734p-3}, + {0x1.b3p-9, 0x1.878p-11}, {0x1.d18p+9, 0x1.20cp+8}, + {0x1.1b8p-12, 0x1.5fp-15}, {0x1.81p+12, 0x1.c5cp+11}, + {0x1.13p-8, 0x1.47cp-9}, {0x1.7e8p+5, 0x1.188p+3}, + {0x1.d9p-5, 0x1.554p-5}, {0x1.d5p+0, 0x1.5fcp+0}, + {0x1.f7cp-4, 0x1.efp-4}, {0x1.cdp+1, 0x1.59cp+1}, + {0x1.abp+0, 0x1.f74p-1}, {0x1.81p-5, 0x1.638p-7}, + {0x1.d8cp+2, 0x1.59p+2}, {0x1.cep+7, 0x1.75cp+7}, + {0x1.9dp+12, 0x1.35cp+12}, {0x1.22p-6, 0x1.7b8p-8}, + {0x1.83p+0, 0x1.7d4p+0}, {0x1.3e8p-11, 0x1.ddcp-12}, + {0x1.a28p+1, 0x1.5ccp+0}, {0x1.848p-5, 0x1.43cp-6}, + {0x1.f7cp-7, 0x1.efp-7}, {0x1.d7p+13, 0x1.12cp+12}, + {0x1.d3p+5, 0x1.5e4p+5}, {0x1.efp-9, 0x1.848p-10}, + {0x1.848p+2, 0x1.43cp+1}, {0x1.e3p+0, 0x1.928p-1}, + {0x1.098p-8, 0x1.ba8p-10}, {0x1.d34p-7, 0x1.bdp-7}, + {0x1.3f8p-12, 0x1.0a4p-13}, {0x1.e3p+7, 0x1.19cp+6}, + {0x1.02p+8, 0x1.3e4p+7}, {0x1.d9p-9, 0x1.62cp-9}, + {0x1.a28p-7, 0x1.ddcp-8}, {0x1.c98p+9, 0x1.7d4p+8}, + {0x1.1dp+5, 0x1.008p+3}, {0x1.9ap+0, 0x1.8fcp-1}, + {0x1.9ep-11, 0x1.1ap-15}, {0x1.81p-4, 0x1.5a8p-6}, + {0x1.218p+13, 0x1.e28p+11}, {0x1.608p+6, 0x1.474p+5}, + {0x1.49p+2, 0x1.83cp+1}, {0x1.258p+1, 0x1.b84p+0}, + {0x1.e14p-8, 0x1.b9p-8}, {0x1.7f4p-9, 0x1.6dp-9}, + {0x1.76p-9, 0x1.e48p-11}, {0x1.56p-9, 0x1.428p-11}, + {0x1.57p-12, 0x1.944p-13}, {0x1.ae8p-9, 0x1.4cp-14}, + {0x1.4dp-10, 0x1.24p-15}, {0x1.668p+3, 0x1.2acp+2}, + {0x1.238p-11, 0x1.b54p-12}, {0x1.9dp-11, 0x1.35cp-11}, + {0x1.368p-12, 0x1.d1cp-13}, {0x1.c5p+10, 0x1.53cp+10}, + {0x1.3bp-7, 0x1.1cp-12}, {0x1.338p+2, 0x1.cd4p+1}, + {0x1.e3p+13, 0x1.6a4p+13}, {0x1.cep-2, 0x1.efp-5}, + {0x1.848p+9, 0x1.43cp+8}, {0x1.998p+14, 0x1.75cp+13}, + {0x1.9f8p-2, 0x1.5a4p-3}, {0x1.c3p+5, 0x1.2b4p+5}, + {0x1.8fp-2, 0x1.7bcp-3}, {0x1.3c8p-3, 0x1.07cp-4}, + {0x1.83p+6, 0x1.7d4p+6}, {0x1.81p+10, 0x1.c5cp+9}, + {0x1.05p+3, 0x1.c7p+0}, {0x1.098p+14, 0x1.ba8p+12}, + {0x1.28p-11, 0x1.59p-14}, {0x1.e84p+2, 0x1.d1p+2}, + {0x1.9c8p+14, 0x1.a7p+11}, {0x1.4e8p+6, 0x1.f5cp+5}, + {0x1.358p-12, 0x1.d04p-13}, {0x1.158p+9, 0x1.d5p+6}, + {0x1.e78p-6, 0x1.02cp-7}, {0x1.a1p-9, 0x1.e68p-11}, + {0x1.458p+9, 0x1.e84p+8}, {0x1.ae8p+9, 0x1.4cp+4}, + {0x1.518p-9, 0x1.194p-10}, {0x1.79p-12, 0x1.d1cp-13}, + {0x1.068p-3, 0x1.22p-7}, {0x1.b7p-1, 0x1.494p-1}, + {0x1.fep-5, 0x1.6a8p-6}, {0x1.b5p+6, 0x1.47cp+6}, + {0x1.de8p-8, 0x1.0bcp-9}, {0x1.6d8p+4, 0x1.5a8p+2}, + {0x1.878p+14, 0x1.83cp+13}, {0x1.ba8p-8, 0x1.70cp-9}, + {0x1.bcp-3, 0x1.d38p-5}, {0x1.a28p+6, 0x1.e8cp+5}, + {0x1.cbp+12, 0x1.464p+11}, {0x1.13p-11, 0x1.5ccp-12}, + {0x1.1dp+6, 0x1.4c8p+4}, {0x1.74cp+7, 0x1.63p+7}, + {0x1.eap-13, 0x1.068p-15}, {0x1.068p+5, 0x1.aa4p+4}, + {0x1.8bp-9, 0x1.638p-11}, {0x1.e3p-5, 0x1.f38p-6}, + {0x1.abcp+10, 0x1.4ap+10}, {0x1.9c8p-6, 0x1.3bp-9}, + {0x1.c28p+6, 0x1.9d4p+5}, {0x1.57p+12, 0x1.944p+11}, + {0x1.34p+1, 0x1.d88p-1}, {0x1.0ap-13, 0x1.1dp-16}, + {0x1.3e8p+9, 0x1.ddcp+8}, {0x1.e3p+1, 0x1.19cp+0}, + {0x1.c2p-7, 0x1.8ecp-7}, {0x1.2dp+12, 0x1.62cp+11}, + {0x1.028p+12, 0x1.af4p+11}, {0x1.e9p+1, 0x1.1d4p+0}, + {0x1.578p-6, 0x1.1e4p-7}, {0x1.c28p-13, 0x1.9d4p-14}, + {0x1.188p+7, 0x1.d38p+5}, {0x1.908p+10, 0x1.4dcp+9}, + {0x1.338p-3, 0x1.cd4p-4}, {0x1.1d8p+0, 0x1.ac4p-1}, + {0x1.a1p-8, 0x1.e68p-10}, {0x1.f2cp-9, 0x1.a2p-9}, + {0x1.218p+7, 0x1.e28p+5}, {0x1.c2p-10, 0x1.964p-10}, + {0x1.f4p+7, 0x1.e78p+6}, {0x1.cc8p+12, 0x1.7fcp+11}, + {0x1.9dp-3, 0x1.e6cp-4}, {0x1.4c8p-4, 0x1.e48p-6}, + {0x1.f8p-5, 0x1.324p-5}, {0x1.cep-2, 0x1.2b4p-3}, + {0x1.838p+12, 0x1.80cp+11}, {0x1.45p-2, 0x1.248p-4}, + {0x1.ccp-14, 0x1.0bcp-14}, {0x1.4ap+8, 0x1.ffp+5}, + {0x1.8d8p-5, 0x1.238p-7}, {0x1.648p+6, 0x1.20cp+5}, + {0x1.b48p-13, 0x1.6bcp-14}, {0x1.0ep+4, 0x1.fep+0}, + {0x1.458p-7, 0x1.e84p-8}, {0x1.2b8p+15, 0x1.c14p+14}, + {0x1.4b8p+15, 0x1.e14p+14}, {0x1.3a8p+0, 0x1.aap-4}, + {0x1.77p-7, 0x1.b58p-9}, {0x1.83p+14, 0x1.c38p+12}, + {0x1.2a8p-12, 0x1.bfcp-13}, {0x1.ed8p+8, 0x1.bdp+5}, + {0x1.d58p-10, 0x1.874p-11}, {0x1.e78p-7, 0x1.e98p-9}, + {0x1.a98p+3, 0x1.758p+1}, {0x1.038p-10, 0x1.b08p-12}, + {0x1.4c8p-8, 0x1.c8cp-9}, {0x1.5a8p-2, 0x1.634p-3}, + {0x1.9c8p-11, 0x1.57cp-12}, {0x1.6a8p-11, 0x1.9ecp-12}, + {0x1.70cp+4, 0x1.65p+4}, {0x1.a98p+10, 0x1.758p+8}, + {0x1.d28p+15, 0x1.84cp+14}, {0x1.d64p+4, 0x1.11p+4}, + {0x1.848p+6, 0x1.43cp+5}, {0x1.c3p-3, 0x1.fep-7}, + {0x1.8fp-6, 0x1.5ecp-6}, {0x1.ab8p+3, 0x1.69p+0}, + {0x1.028p-2, 0x1.af4p-3}, {0x1.ccp-2, 0x1.0bcp-2}, + {0x1.c98p-5, 0x1.7d4p-6}, {0x1.8fp+1, 0x1.d18p-1}, + {0x1.be4p+12, 0x1.76p+12}, {0x1.a58p-9, 0x1.5f4p-10}, + {0x1.f2cp+6, 0x1.56p+5}, {0x1.86p+6, 0x1.82cp+6}, + {0x1.458p+7, 0x1.93p+4}, {0x1.3bp+0, 0x1.644p-1}, + {0x1.9bp+6, 0x1.df8p+4}, {0x1.b58p+2, 0x1.3ecp+1}, + {0x1.788p+6, 0x1.39cp+5}, {0x1.068p+5, 0x1.b58p+3}, + {0x1.bcp+9, 0x1.d38p+7}, {0x1.e14p-13, 0x1.b9p-13}, + {0x1.e6p+5, 0x1.b6cp+5}, {0x1.cep+13, 0x1.2b4p+12}, + {0x1.908p+1, 0x1.4dcp+0}, {0x1.e5p-8, 0x1.b48p-10}, + {0x1.d34p+9, 0x1.bdp+9}, {0x1.4b8p+3, 0x1.e14p+2}, + {0x1.3c8p+2, 0x1.dacp+1}, {0x1.4dp-5, 0x1.848p-7}, + {0x1.49p-1, 0x1.644p-2}, {0x1.efp+6, 0x1.fb8p+5}, + {0x1.288p-5, 0x1.bccp-6}, {0x1.9c8p+2, 0x1.57cp+1}, + {0x1.81p-6, 0x1.c5cp-7}, {0x1.57p+2, 0x1.944p+1}, + {0x1.4ap-12, 0x1.ffp-15}, {0x1.1dp-1, 0x1.4c8p-3}, + {0x1.a2p+13, 0x1.89cp+13}, {0x1.218p-12, 0x1.b24p-13}, + {0x1.3f8p-5, 0x1.0a4p-6}, {0x1.9ap+15, 0x1.44p+10}, + {0x1.a9p-11, 0x1.7e8p-13}, {0x1.23p-3, 0x1.538p-5}, + {0x1.59p-10, 0x1.928p-12}, {0x1.89cp-5, 0x1.77p-5}, + {0x1.c2p-4, 0x1.8ecp-4}, {0x1.218p-7, 0x1.b24p-8}, + {0x1.ed8p-2, 0x1.bdp-5}, {0x1.fep-8, 0x1.298p-9}, + {0x1.e78p-2, 0x1.32p-6}, {0x1.3f8p-2, 0x1.0a4p-3}, + {0x1.bacp-5, 0x1.65p-5}, {0x1.308p-5, 0x1.e3cp-6}, + {0x1.d1p-12, 0x1.a4cp-13}, {0x1.368p+1, 0x1.02cp+0}, + {0x1.2d8p-11, 0x1.f68p-13}, {0x1.9ecp+2, 0x1.8bp+2}, + {0x1.338p+8, 0x1.cd4p+7}, {0x1.8bp-7, 0x1.638p-9}, + {0x1.d88p+5, 0x1.5a8p+3}, {0x1.4ap-6, 0x1.ffp-9}, + {0x1.e9p+7, 0x1.978p+6}, {0x1.128p+1, 0x1.9bcp+0}, + {0x1.56p+8, 0x1.43p+5}, {0x1.298p+11, 0x1.4acp+10}, + {0x1.368p-10, 0x1.5acp-11}, {0x1.3a8p-12, 0x1.aap-16}, + {0x1.77p-1, 0x1.b58p-3}, {0x1.6f8p-10, 0x1.774p-11}, + {0x1.928p+13, 0x1.a04p+12}, {0x1.f2cp+6, 0x1.dbp+6}, + {0x1.5a8p+7, 0x1.adp+4}, {0x1.b2p-7, 0x1.d1p-10}, + {0x1.e3cp+9, 0x1.02p+9}, {0x1.35p-8, 0x1.688p-10}, + {0x1.9dp-4, 0x1.35cp-4}, {0x1.a4p+14, 0x1.ce8p+12}, + {0x1.d18p+11, 0x1.de8p+9}, {0x1.318p+6, 0x1.ca4p+5}, + {0x1.298p-3, 0x1.be4p-4}, {0x1.2cp+0, 0x1.36p-4}, + {0x1.2dp+9, 0x1.0a4p+8}, {0x1.c08p+12, 0x1.b9p+9}, + {0x1.f7p-1, 0x1.794p-1}, {0x1.ce8p-4, 0x1.1acp-5}, + {0x1.76p+15, 0x1.e48p+13}, {0x1.31p+2, 0x1.128p+0}, + {0x1.338p-2, 0x1.868p-4}, {0x1.e3cp-10, 0x1.2dp-10}, + {0x1.e78p-10, 0x1.02cp-11}, {0x1.d7p-1, 0x1.12cp-2}, + {0x1.81p-2, 0x1.5a8p-4}, {0x1.ffp-5, 0x1.7f4p-5}, + {0x1.6f8p-7, 0x1.c7p-10}, {0x1.f7cp-11, 0x1.98p-11}, + {0x1.b3p+12, 0x1.fb8p+10}, {0x1.4b8p+12, 0x1.224p+11}, + {0x1.8d8p-13, 0x1.dd4p-14}, {0x1.e14p+0, 0x1.c2p-1}, + {0x1.248p-2, 0x1.524p-3}, {0x1.a3p+12, 0x1.3a4p+12}, + {0x1.bdp-11, 0x1.4dcp-11}, {0x1.418p+0, 0x1.e24p-1}, + {0x1.fep-9, 0x1.6a8p-10}, {0x1.a98p-8, 0x1.758p-10}, + {0x1.1dp+11, 0x1.0f4p+10}, {0x1.5a8p+0, 0x1.20cp-1}, + {0x1.f2cp-3, 0x1.0ap-3}, {0x1.7e8p+15, 0x1.188p+13}, }; #endif // LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H diff --git a/libc/test/src/math/smoke/CMakeLists.txt b/libc/test/src/math/smoke/CMakeLists.txt index 639fe9590ef39..09474d5df27db 100644 --- a/libc/test/src/math/smoke/CMakeLists.txt +++ b/libc/test/src/math/smoke/CMakeLists.txt @@ -3132,7 +3132,6 @@ add_fp_unittest( DEPENDS libc.src.math.hypotf16 libc.src.__support.FPUtil.fp_bits - libc.src.__support.macros.properties.architectures ) add_fp_unittest( From 862e069cdcadb51a1daf8c3a546c01ac4813fe2c Mon Sep 17 00:00:00 2001 From: meltq Date: Wed, 26 Mar 2025 14:05:31 +0530 Subject: [PATCH 09/21] Added increment, cleanup --- libc/src/math/generic/hypotf16.cpp | 11 ++++++----- libc/test/src/math/exhaustive/hypotf16_test.cpp | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp index b7255bc4420db..a7814418f75be 100644 --- a/libc/src/math/generic/hypotf16.cpp +++ b/libc/src/math/generic/hypotf16.cpp @@ -51,12 +51,12 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { << FPBits::FRACTION_LEN))) return x_abs.get_val() + y_abs.get_val(); - float ad = fputil::cast(a_bits.get_val()); - float bd = fputil::cast(b_bits.get_val()); + float af = fputil::cast(a_bits.get_val()); + float bf = fputil::cast(b_bits.get_val()); // These squares are exact. - float a_sq = ad * ad; - float sum_sq = fputil::multiply_add(bd, bd, a_sq); + float a_sq = af * af; + float sum_sq = fputil::multiply_add(bf, bf, a_sq); FloatBits result(fputil::sqrt(sum_sq)); uint32_t r_u = result.uintval(); @@ -67,7 +67,7 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { float r_d = result.get_val(); // Perform rounding correction. - float sum_sq_lo = fputil::multiply_add(bd, bd, a_sq - sum_sq); + float sum_sq_lo = fputil::multiply_add(bf, bf, a_sq - sum_sq); float err = sum_sq_lo - fputil::multiply_add(r_d, r_d, -sum_sq); if (err > 0) { @@ -83,4 +83,5 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { return fputil::cast(result.get_val()); } + } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index 3ba752bd81f24..bbd900a45031b 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -51,7 +51,7 @@ struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { }; using LlvmLibcHypotf16ExhaustiveTest = - LlvmLibcExhaustiveMathTest; + LlvmLibcExhaustiveMathTest; TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { test_full_range_all_roundings(START, STOP); From 0677b192d33332d28a65eb73e022f352cba97319 Mon Sep 17 00:00:00 2001 From: meltq Date: Fri, 28 Mar 2025 09:53:52 +0530 Subject: [PATCH 10/21] Added perf test --- .../src/math/performance_testing/CMakeLists.txt | 12 ++++++++++++ .../src/math/performance_testing/hypotf16_perf.cpp | 14 ++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 libc/test/src/math/performance_testing/hypotf16_perf.cpp diff --git a/libc/test/src/math/performance_testing/CMakeLists.txt b/libc/test/src/math/performance_testing/CMakeLists.txt index 838ed9e957ca7..d8f87e04c15d8 100644 --- a/libc/test/src/math/performance_testing/CMakeLists.txt +++ b/libc/test/src/math/performance_testing/CMakeLists.txt @@ -340,6 +340,18 @@ add_perf_binary( -fno-builtin ) +add_perf_binary( + hypotf16_perf + SRCS + hypotf16_perf.cpp + DEPENDS + .binary_op_single_output_diff + libc.src.math.hypotf16 + libc.src.__support.FPUtil.fp_bits + COMPILE_OPTIONS + -fno-builtin +) + add_perf_binary( hypotf_perf SRCS diff --git a/libc/test/src/math/performance_testing/hypotf16_perf.cpp b/libc/test/src/math/performance_testing/hypotf16_perf.cpp new file mode 100644 index 0000000000000..25a063d79492d --- /dev/null +++ b/libc/test/src/math/performance_testing/hypotf16_perf.cpp @@ -0,0 +1,14 @@ +//===-- Differential test for hypotf16 ------------------------------------===// +// +// 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 "BinaryOpSingleOutputPerf.h" + +#include "src/math/hypotf16.h" +#include "src/__support/FPUtil/Hypot.h" + +BINARY_OP_SINGLE_OUTPUT_PERF(float16, float16, LIBC_NAMESPACE::hypotf16, LIBC_NAMESPACE::fputil::hypot, "hypotf16_perf.log"); From 22dc48fce3fb732c97a3fcdff2ebea3166bf0719 Mon Sep 17 00:00:00 2001 From: meltq Date: Fri, 28 Mar 2025 09:56:53 +0530 Subject: [PATCH 11/21] formatting changes --- libc/test/src/math/performance_testing/hypotf16_perf.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libc/test/src/math/performance_testing/hypotf16_perf.cpp b/libc/test/src/math/performance_testing/hypotf16_perf.cpp index 25a063d79492d..f8bf3a4500606 100644 --- a/libc/test/src/math/performance_testing/hypotf16_perf.cpp +++ b/libc/test/src/math/performance_testing/hypotf16_perf.cpp @@ -8,7 +8,9 @@ #include "BinaryOpSingleOutputPerf.h" -#include "src/math/hypotf16.h" #include "src/__support/FPUtil/Hypot.h" +#include "src/math/hypotf16.h" -BINARY_OP_SINGLE_OUTPUT_PERF(float16, float16, LIBC_NAMESPACE::hypotf16, LIBC_NAMESPACE::fputil::hypot, "hypotf16_perf.log"); +BINARY_OP_SINGLE_OUTPUT_PERF(float16, float16, LIBC_NAMESPACE::hypotf16, + LIBC_NAMESPACE::fputil::hypot, + "hypotf16_perf.log"); From 399e5ffbcd38abc9e479acdaca85357618fd03e2 Mon Sep 17 00:00:00 2001 From: meltq Date: Fri, 28 Mar 2025 13:25:34 +0530 Subject: [PATCH 12/21] Replace fputil::cast with static_cast --- libc/src/math/generic/hypotf16.cpp | 6 +++--- libc/test/src/math/performance_testing/hypotf16_perf.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp index a7814418f75be..577f85769e66b 100644 --- a/libc/src/math/generic/hypotf16.cpp +++ b/libc/src/math/generic/hypotf16.cpp @@ -51,8 +51,8 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { << FPBits::FRACTION_LEN))) return x_abs.get_val() + y_abs.get_val(); - float af = fputil::cast(a_bits.get_val()); - float bf = fputil::cast(b_bits.get_val()); + float af = static_cast(a_bits.get_val()); + float bf = static_cast(b_bits.get_val()); // These squares are exact. float a_sq = af * af; @@ -81,7 +81,7 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { return fputil::cast(FloatBits(r_u).get_val()); } - return fputil::cast(result.get_val()); + return static_cast(result.get_val()); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/src/math/performance_testing/hypotf16_perf.cpp b/libc/test/src/math/performance_testing/hypotf16_perf.cpp index f8bf3a4500606..b53a9042171a6 100644 --- a/libc/test/src/math/performance_testing/hypotf16_perf.cpp +++ b/libc/test/src/math/performance_testing/hypotf16_perf.cpp @@ -13,4 +13,4 @@ BINARY_OP_SINGLE_OUTPUT_PERF(float16, float16, LIBC_NAMESPACE::hypotf16, LIBC_NAMESPACE::fputil::hypot, - "hypotf16_perf.log"); + "hypotf16_perf.log") From 24c5d78233cd191387a7cb3008ea5f7fa4271273 Mon Sep 17 00:00:00 2001 From: meltq Date: Fri, 28 Mar 2025 14:41:41 +0530 Subject: [PATCH 13/21] Removed hard to round cases --- libc/test/src/math/hypotf16_hard_to_round.h | 522 -------------------- libc/test/src/math/hypotf16_test.cpp | 6 - 2 files changed, 528 deletions(-) delete mode 100644 libc/test/src/math/hypotf16_hard_to_round.h diff --git a/libc/test/src/math/hypotf16_hard_to_round.h b/libc/test/src/math/hypotf16_hard_to_round.h deleted file mode 100644 index 15e0dc13adbf3..0000000000000 --- a/libc/test/src/math/hypotf16_hard_to_round.h +++ /dev/null @@ -1,522 +0,0 @@ -//===-- Hard-to-round inputs for hypotf16 ----------------------------C++--===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H -#define LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H - -#include "utils/MPFRWrapper/MPFRUtils.h" - -namespace mpfr = LIBC_NAMESPACE::testing::mpfr; - -// 1000 cases where the precise result is between two consecutive -// Float16 numbers -constexpr int N_HARD_TO_ROUND = 1000; -constexpr mpfr::BinaryInput HYPOTF16_HARD_TO_ROUND[N_HARD_TO_ROUND] = { - {0x1.3b8p-5, 0x1.d94p-6}, {0x1.068p-7, 0x1.1ccp-8}, - {0x1.1dp-3, 0x1.4c8p-5}, {0x1.c38p-2, 0x1.784p-3}, - {0x1.e3cp-3, 0x1.02p-3}, {0x1.04p-8, 0x1.b3p-11}, - {0x1.e3p+5, 0x1.928p+4}, {0x1.8bp+4, 0x1.638p+2}, - {0x1.4fp+1, 0x1.2d8p-1}, {0x1.458p+3, 0x1.0f4p+2}, - {0x1.c08p+1, 0x1.75cp+0}, {0x1.1fp-13, 0x1.524p-14}, - {0x1.36p-3, 0x1.2e4p-4}, {0x1.b58p-9, 0x1.3ecp-10}, - {0x1.d74p+6, 0x1.a7p+6}, {0x1.dc4p-6, 0x1.fcp-7}, - {0x1.6f8p-3, 0x1.324p-4}, {0x1.86p+13, 0x1.7c4p+12}, - {0x1.9c8p+4, 0x1.57cp+3}, {0x1.81p+7, 0x1.638p+5}, - {0x1.488p+9, 0x1.11cp+8}, {0x1.0a8p+12, 0x1.f68p+10}, - {0x1.008p-8, 0x1.bcp-13}, {0x1.818p-8, 0x1.414p-9}, - {0x1.efp+1, 0x1.814p+1}, {0x1.b6cp+6, 0x1.11p+6}, - {0x1.458p+10, 0x1.93p+7}, {0x1.058p+13, 0x1.884p+12}, - {0x1.ae8p+7, 0x1.0a8p+5}, {0x1.9c8p+7, 0x1.60cp+6}, - {0x1.2cp+2, 0x1.14cp+1}, {0x1.9bp+13, 0x1.df8p+11}, - {0x1.b2p+14, 0x1.d1p+11}, {0x1.f8p-10, 0x1.d1cp-10}, - {0x1.22p-13, 0x1.7b8p-15}, {0x1.cep-13, 0x1.104p-13}, - {0x1.2e8p+5, 0x1.cep+1}, {0x1.edp-10, 0x1.71cp-10}, - {0x1.6f8p+12, 0x1.96p+8}, {0x1.e78p+7, 0x1.32p+3}, - {0x1.2dp-1, 0x1.62cp-2}, {0x1.ab8p-4, 0x1.72p-8}, - {0x1.ab8p+7, 0x1.398p+5}, {0x1.97p-10, 0x1.1b8p-12}, - {0x1.eap+5, 0x1.068p+3}, {0x1.fdp+11, 0x1.7dcp+11}, - {0x1.fbp-14, 0x1.b04p-14}, {0x1.3bp+14, 0x1.6f8p+12}, - {0x1.4c8p+5, 0x1.c8cp+4}, {0x1.848p-3, 0x1.e1p-6}, - {0x1.72p+4, 0x1.68cp+3}, {0x1.2a8p-10, 0x1.bfcp-11}, - {0x1.d8cp+9, 0x1.59p+9}, {0x1.e3p+12, 0x1.a2cp+12}, - {0x1.81p-8, 0x1.5a8p-10}, {0x1.b48p+3, 0x1.6bcp+2}, - {0x1.14p+8, 0x1.bbcp+7}, {0x1.72p-1, 0x1.cep-5}, - {0x1.068p-3, 0x1.aa4p-4}, {0x1.7b8p+5, 0x1.e8cp+4}, - {0x1.14p-9, 0x1.998p-11}, {0x1.878p+1, 0x1.83cp+0}, - {0x1.068p+5, 0x1.41cp+4}, {0x1.0bp+14, 0x1.378p+12}, - {0x1.2dp-2, 0x1.0a4p-3}, {0x1.ed8p+10, 0x1.bdp+7}, - {0x1.f8p+5, 0x1.158p+4}, {0x1.44p-2, 0x1.62cp-3}, - {0x1.a4p+11, 0x1.ce8p+9}, {0x1.fbp+5, 0x1.45p+2}, - {0x1.1dp+4, 0x1.4c8p+2}, {0x1.2a8p-1, 0x1.f18p-3}, - {0x1.2dp-11, 0x1.0a4p-12}, {0x1.c2p-8, 0x1.b6cp-9}, - {0x1.adp+12, 0x1.41cp+12}, {0x1.9fp+4, 0x1.758p+2}, - {0x1.42p-7, 0x1.59p-10}, {0x1.198p-8, 0x1.a64p-9}, - {0x1.f2cp-2, 0x1.56p-3}, {0x1.e14p-2, 0x1.b9p-2}, - {0x1.158p+7, 0x1.d5p+4}, {0x1.1f8p+7, 0x1.af4p+6}, - {0x1.d88p-6, 0x1.8fp-9}, {0x1.38p-8, 0x1.f1p-11}, - {0x1.3bp-8, 0x1.1cp-13}, {0x1.4a8p-4, 0x1.efcp-5}, - {0x1.efp-2, 0x1.848p-3}, {0x1.cep-1, 0x1.75cp-1}, - {0x1.098p+12, 0x1.ba8p+10}, {0x1.1fp+13, 0x1.c08p+11}, - {0x1.d9p-12, 0x1.5cp-17}, {0x1.89cp+8, 0x1.77p+8}, - {0x1.158p+0, 0x1.97p-3}, {0x1.d7p+1, 0x1.614p+1}, - {0x1.b3p+5, 0x1.878p+3}, {0x1.028p-4, 0x1.af4p-5}, - {0x1.93p-6, 0x1.b3cp-7}, {0x1.4d8p+13, 0x1.f44p+12}, - {0x1.d4cp+5, 0x1.f4p+4}, {0x1.efp-11, 0x1.59p-14}, - {0x1.b6cp+11, 0x1.11p+11}, {0x1.328p+11, 0x1.cbcp+10}, - {0x1.bap+0, 0x1.be4p-1}, {0x1.318p+11, 0x1.ca4p+10}, - {0x1.74cp-13, 0x1.63p-13}, {0x1.3bp+11, 0x1.1b8p+9}, - {0x1.278p-5, 0x1.bb4p-6}, {0x1.1f8p+7, 0x1.74cp+6}, - {0x1.848p-12, 0x1.8bp-15}, {0x1.28p-5, 0x1.59p-8}, - {0x1.9ep+11, 0x1.87p+8}, {0x1.d38p-10, 0x1.e78p-12}, - {0x1.abp-8, 0x1.f74p-9}, {0x1.5fp+12, 0x1.c2p+8}, - {0x1.dbp-13, 0x1.998p-14}, {0x1.0e8p-5, 0x1.95cp-6}, - {0x1.98p+6, 0x1.8a4p+5}, {0x1.998p+0, 0x1.fbp-3}, - {0x1.188p+2, 0x1.d38p+0}, {0x1.efp-5, 0x1.814p-5}, - {0x1.dbp-10, 0x1.464p-10}, {0x1.1a8p-10, 0x1.a7cp-11}, - {0x1.068p-12, 0x1.41cp-13}, {0x1.ba8p-4, 0x1.448p-6}, - {0x1.658p+10, 0x1.89cp+9}, {0x1.9c8p+2, 0x1.2e8p+0}, - {0x1.d88p-12, 0x1.89cp-13}, {0x1.508p+4, 0x1.f8cp+3}, - {0x1.c2p-8, 0x1.be4p-8}, {0x1.d4cp+9, 0x1.f4p+8}, - {0x1.198p+5, 0x1.a64p+4}, {0x1.9ap-5, 0x1.44p-10}, - {0x1.d5p+5, 0x1.5fcp+5}, {0x1.dbp-3, 0x1.ab8p-5}, - {0x1.efp-14, 0x1.3ecp-14}, {0x1.05p+0, 0x1.c7p-3}, - {0x1.c7p+15, 0x1.998p+13}, {0x1.658p+7, 0x1.7b8p+5}, - {0x1.c98p+11, 0x1.7d4p+10}, {0x1.c2p+2, 0x1.a9p-1}, - {0x1.fdp-9, 0x1.7dcp-9}, {0x1.3bp-6, 0x1.6f8p-8}, - {0x1.d18p+3, 0x1.de8p+1}, {0x1.2cp+1, 0x1.36p-3}, - {0x1.458p-4, 0x1.e84p-5}, {0x1.3f8p+8, 0x1.df4p+7}, - {0x1.c2p+1, 0x1.26p-3}, {0x1.e5p+9, 0x1.6bcp+9}, - {0x1.e7p+4, 0x1.6d4p+4}, {0x1.318p-12, 0x1.7f4p-13}, - {0x1.cbp-2, 0x1.0bcp-3}, {0x1.068p-3, 0x1.41cp-4}, - {0x1.55p+10, 0x1.e78p+8}, {0x1.c5cp+14, 0x1.8cp+14}, - {0x1.a28p-1, 0x1.ddcp-2}, {0x1.848p-7, 0x1.43cp-8}, - {0x1.9ecp-6, 0x1.8bp-6}, {0x1.3bp-2, 0x1.364p-3}, - {0x1.c2p+13, 0x1.26p+9}, {0x1.1b8p-13, 0x1.a94p-14}, - {0x1.dbp+11, 0x1.ab8p+9}, {0x1.f3p-13, 0x1.764p-13}, - {0x1.32p+7, 0x1.ae8p+5}, {0x1.2dp-4, 0x1.0a4p-5}, - {0x1.d8cp+7, 0x1.59p+7}, {0x1.05p+1, 0x1.308p-1}, - {0x1.d64p+7, 0x1.11p+7}, {0x1.6f8p+7, 0x1.324p+6}, - {0x1.d88p+8, 0x1.248p+6}, {0x1.008p+5, 0x1.ab8p+3}, - {0x1.248p+4, 0x1.f2cp+3}, {0x1.e5p-11, 0x1.b48p-13}, - {0x1.c2p+7, 0x1.964p+7}, {0x1.fa4p+0, 0x1.3bp+0}, - {0x1.058p-12, 0x1.884p-13}, {0x1.f2p-13, 0x1.228p-14}, - {0x1.c5cp-14, 0x1.8cp-14}, {0x1.cep+4, 0x1.75cp+4}, - {0x1.71p+15, 0x1.81p+12}, {0x1.3bp+12, 0x1.644p+11}, - {0x1.188p-8, 0x1.0cp-13}, {0x1.2fp+9, 0x1.618p+7}, - {0x1.088p+11, 0x1.8ccp+10}, {0x1.c3p+9, 0x1.524p+9}, - {0x1.f2cp+8, 0x1.44p+8}, {0x1.11p-7, 0x1.34cp-8}, - {0x1.efp+9, 0x1.848p+8}, {0x1.fa4p+11, 0x1.0ep+11}, - {0x1.3e8p-7, 0x1.ddcp-8}, {0x1.288p-13, 0x1.bccp-14}, - {0x1.518p-8, 0x1.fa4p-9}, {0x1.c7p-3, 0x1.944p-4}, - {0x1.338p+3, 0x1.c3p+0}, {0x1.1b8p+14, 0x1.d88p+12}, - {0x1.d7p-5, 0x1.614p-5}, {0x1.9ep+6, 0x1.87p+3}, - {0x1.e9p+13, 0x1.6ecp+13}, {0x1.9dp-3, 0x1.35cp-3}, - {0x1.318p+13, 0x1.ca4p+12}, {0x1.11p+1, 0x1.cd4p+0}, - {0x1.26p-10, 0x1.3bp-13}, {0x1.adp+14, 0x1.13p+11}, - {0x1.9bcp-7, 0x1.76p-7}, {0x1.e6p-10, 0x1.cbp-13}, - {0x1.dbp-2, 0x1.86p-6}, {0x1.f2cp+3, 0x1.dbp+3}, - {0x1.2a8p+3, 0x1.bfcp+2}, {0x1.f2cp+14, 0x1.0ap+14}, - {0x1.5cp+13, 0x1.b6cp+12}, {0x1.3d8p+3, 0x1.dc4p+2}, - {0x1.0b8p-10, 0x1.914p-11}, {0x1.5cp+3, 0x1.6dcp+2}, - {0x1.ba8p+0, 0x1.70cp-1}, {0x1.45p-2, 0x1.20cp-3}, - {0x1.ab8p+5, 0x1.72p+1}, {0x1.dbp-13, 0x1.86p-17}, - {0x1.aep-9, 0x1.6a4p-9}, {0x1.298p-13, 0x1.14p-18}, - {0x1.0f8p-10, 0x1.974p-11}, {0x1.ddp+1, 0x1.65cp+1}, - {0x1.d88p-6, 0x1.5a8p-8}, {0x1.08p-4, 0x1.04p-9}, - {0x1.318p-1, 0x1.ca4p-2}, {0x1.45p-8, 0x1.248p-10}, - {0x1.068p+14, 0x1.1ccp+13}, {0x1.468p+13, 0x1.e9cp+12}, - {0x1.aa4p-9, 0x1.74p-9}, {0x1.02p+3, 0x1.3e4p+2}, - {0x1.6bp-11, 0x1.a78p-13}, {0x1.158p-5, 0x1.d5p-8}, - {0x1.0f8p-4, 0x1.974p-5}, {0x1.1ep-1, 0x1.728p-3}, - {0x1.a9p+8, 0x1.7e8p+6}, {0x1.86p+13, 0x1.3cp+8}, - {0x1.c2p+6, 0x1.8ecp+6}, {0x1.238p-4, 0x1.b54p-5}, - {0x1.3bp-13, 0x1.734p-14}, {0x1.aep-3, 0x1.f2p-7}, - {0x1.2cp+7, 0x1.36p+3}, {0x1.70cp+13, 0x1.65p+13}, - {0x1.ed8p-9, 0x1.bdp-12}, {0x1.188p+15, 0x1.248p+13}, - {0x1.5ep+15, 0x1.77p+12}, {0x1.bd8p-8, 0x1.6f8p-10}, - {0x1.e78p+8, 0x1.32p+4}, {0x1.c38p-8, 0x1.784p-9}, - {0x1.008p+5, 0x1.658p+3}, {0x1.6f8p-9, 0x1.0d8p-11}, - {0x1.9c8p-13, 0x1.2e8p-15}, {0x1.4f8p+15, 0x1.f74p+14}, - {0x1.158p+11, 0x1.d5p+8}, {0x1.9c8p-3, 0x1.57cp-4}, - {0x1.0c8p+15, 0x1.bf8p+13}, {0x1.5a8p-3, 0x1.518p-5}, - {0x1.e84p+7, 0x1.d1p+7}, {0x1.abp-12, 0x1.f74p-13}, - {0x1.1ep+13, 0x1.728p+11}, {0x1.8cp-3, 0x1.e14p-4}, - {0x1.6d8p+7, 0x1.5a8p+5}, {0x1.e9p-13, 0x1.6ecp-13}, - {0x1.7e8p+10, 0x1.188p+8}, {0x1.17p+10, 0x1.f7cp+9}, - {0x1.dfp-8, 0x1.674p-8}, {0x1.d34p+5, 0x1.bdp+5}, - {0x1.018p-2, 0x1.824p-3}, {0x1.6f8p-13, 0x1.c7p-16}, - {0x1.a58p+11, 0x1.5f4p+10}, {0x1.e3cp+3, 0x1.02p+3}, - {0x1.cbp-5, 0x1.584p-5}, {0x1.5a8p+9, 0x1.3c4p+8}, - {0x1.528p-8, 0x1.fbcp-9}, {0x1.1b8p+9, 0x1.a94p+8}, - {0x1.788p-7, 0x1.39cp-8}, {0x1.f2cp+4, 0x1.56p+3}, - {0x1.f2cp+2, 0x1.fap+1}, {0x1.218p+5, 0x1.b24p+4}, - {0x1.fbp+4, 0x1.7c4p+4}, {0x1.45p-3, 0x1.20cp-4}, - {0x1.368p+12, 0x1.338p+10}, {0x1.1ep-3, 0x1.20cp-4}, - {0x1.c5p+6, 0x1.084p+5}, {0x1.afp+12, 0x1.434p+12}, - {0x1.bfp-3, 0x1.4f4p-3}, {0x1.d4p+8, 0x1.d88p+7}, - {0x1.e3cp-5, 0x1.02p-5}, {0x1.adp+9, 0x1.6dcp+9}, - {0x1.b8p+3, 0x1.f44p+2}, {0x1.ddcp+7, 0x1.c7p+7}, - {0x1.248p-10, 0x1.e78p-12}, {0x1.efp+13, 0x1.9c8p+12}, - {0x1.a2p+5, 0x1.89cp+5}, {0x1.298p+8, 0x1.be4p+7}, - {0x1.0f8p-12, 0x1.974p-13}, {0x1.dcp-8, 0x1.cep-12}, - {0x1.c38p+0, 0x1.784p-1}, {0x1.038p+11, 0x1.854p+10}, - {0x1.b3cp+11, 0x1.9fp+11}, {0x1.5fp-4, 0x1.c2p-8}, - {0x1.c7p+2, 0x1.554p+2}, {0x1.c38p-12, 0x1.178p-14}, - {0x1.f14p+2, 0x1.cep+2}, {0x1.3e8p-13, 0x1.ddcp-14}, - {0x1.188p+12, 0x1.248p+10}, {0x1.b04p-13, 0x1.1dp-13}, - {0x1.c5cp-7, 0x1.8cp-7}, {0x1.22p-11, 0x1.7b8p-13}, - {0x1.338p+0, 0x1.868p-2}, {0x1.f44p+2, 0x1.d4p+0}, - {0x1.0d8p+1, 0x1.944p+0}, {0x1.a88p-9, 0x1.61cp-10}, - {0x1.178p+14, 0x1.254p+13}, {0x1.2cp+15, 0x1.36p+11}, - {0x1.7ap-1, 0x1.95p-4}, {0x1.adp+14, 0x1.f48p+12}, - {0x1.c2p-2, 0x1.964p-2}, {0x1.a1p-6, 0x1.38cp-6}, - {0x1.518p+6, 0x1.efp+3}, {0x1.32p+1, 0x1.fa4p+0}, - {0x1.ccp-11, 0x1.0bcp-11}, {0x1.96p+14, 0x1.b3p+11}, - {0x1.308p+14, 0x1.fb8p+12}, {0x1.02p-11, 0x1.3e4p-12}, - {0x1.be4p+1, 0x1.76p+1}, {0x1.c08p-3, 0x1.b9p-6}, - {0x1.e3p-13, 0x1.928p-14}, {0x1.218p-2, 0x1.b24p-3}, - {0x1.22p+5, 0x1.1acp+4}, {0x1.bfp+14, 0x1.4f4p+14}, - {0x1.78p-5, 0x1.284p-6}, {0x1.ae8p-4, 0x1.4cp-9}, - {0x1.c2p-12, 0x1.be4p-12}, {0x1.458p+6, 0x1.e84p+5}, - {0x1.efp-14, 0x1.fb8p-15}, {0x1.cd4p-1, 0x1.1fp-1}, - {0x1.71p+12, 0x1.81p+9}, {0x1.cbp+4, 0x1.584p+4}, - {0x1.3d8p-1, 0x1.dc4p-2}, {0x1.c2p+9, 0x1.68cp+9}, - {0x1.128p+1, 0x1.c98p-1}, {0x1.068p-4, 0x1.7e8p-6}, - {0x1.178p-6, 0x1.a34p-7}, {0x1.c38p+7, 0x1.784p+6}, - {0x1.158p+6, 0x1.ce8p+4}, {0x1.e78p-12, 0x1.658p-14}, - {0x1.83p-7, 0x1.7d4p-7}, {0x1.658p-3, 0x1.7b8p-5}, - {0x1.bd8p+3, 0x1.734p+2}, {0x1.408p+3, 0x1.e0cp+2}, - {0x1.d1p+5, 0x1.0f4p+4}, {0x1.848p-9, 0x1.43cp-10}, - {0x1.ccp-8, 0x1.554p-9}, {0x1.45p+4, 0x1.248p+2}, - {0x1.a5p-10, 0x1.3bcp-10}, {0x1.65p-4, 0x1.a08p-6}, - {0x1.408p-9, 0x1.e0cp-10}, {0x1.c38p+3, 0x1.54p-2}, - {0x1.518p+12, 0x1.194p+11}, {0x1.c2p-11, 0x1.8ecp-11}, - {0x1.d88p-1, 0x1.8fp-4}, {0x1.268p+6, 0x1.b9cp+5}, - {0x1.74p+11, 0x1.4fcp+10}, {0x1.188p-2, 0x1.0cp-7}, - {0x1.c7p+8, 0x1.998p+6}, {0x1.3fp+13, 0x1.11cp+12}, - {0x1.608p-5, 0x1.474p-6}, {0x1.4ap+4, 0x1.ffp+1}, - {0x1.3bp-13, 0x1.a34p-14}, {0x1.5f8p+3, 0x1.2cp-2}, - {0x1.58p-5, 0x1.9c8p-7}, {0x1.f2cp+14, 0x1.56p+13}, - {0x1.988p+3, 0x1.95p+0}, {0x1.f2cp+13, 0x1.fap+12}, - {0x1.e14p+6, 0x1.a4p+6}, {0x1.efp-7, 0x1.64p-12}, - {0x1.fbp-8, 0x1.7c4p-8}, {0x1.95p-4, 0x1.6c8p-6}, - {0x1.68p+9, 0x1.f48p+7}, {0x1.668p+5, 0x1.2acp+4}, - {0x1.608p+15, 0x1.028p+13}, {0x1.13p+8, 0x1.47cp+7}, - {0x1.518p-13, 0x1.c38p-15}, {0x1.5a8p+0, 0x1.adp-3}, - {0x1.f5p-10, 0x1.77cp-10}, {0x1.05p-5, 0x1.c7p-8}, - {0x1.b3cp-10, 0x1.9fp-10}, {0x1.488p-13, 0x1.11cp-14}, - {0x1.e3p+2, 0x1.a2cp+2}, {0x1.8ecp+2, 0x1.5cp+2}, - {0x1.abp-4, 0x1.404p-4}, {0x1.398p-11, 0x1.71p-14}, - {0x1.c2p-7, 0x1.a9p-10}, {0x1.d8cp+1, 0x1.59p+1}, - {0x1.848p-2, 0x1.8bp-5}, {0x1.0ep-5, 0x1.b38p-7}, - {0x1.d9p+14, 0x1.554p+14}, {0x1.aep+2, 0x1.a34p+1}, - {0x1.d64p+14, 0x1.81p+14}, {0x1.8a8p+0, 0x1.48cp-1}, - {0x1.308p+3, 0x1.79p+0}, {0x1.6f8p+3, 0x1.774p+2}, - {0x1.428p+1, 0x1.d9p-2}, {0x1.108p-5, 0x1.98cp-6}, - {0x1.b9p+11, 0x1.014p+10}, {0x1.de8p+5, 0x1.0bcp+4}, - {0x1.b6cp-1, 0x1.b5p-1}, {0x1.cep-6, 0x1.75cp-6}, - {0x1.0f8p+9, 0x1.974p+8}, {0x1.ee8p+10, 0x1.0bp+7}, - {0x1.2cp+15, 0x1.14cp+14}, {0x1.5f8p-11, 0x1.2cp-16}, - {0x1.f7cp-13, 0x1.efp-13}, {0x1.2fp+12, 0x1.618p+10}, - {0x1.0e8p-3, 0x1.95cp-4}, {0x1.a1p+11, 0x1.38cp+11}, - {0x1.86p-11, 0x1.7c4p-12}, {0x1.028p+7, 0x1.83cp+6}, - {0x1.f74p+5, 0x1.49p+5}, {0x1.65p+3, 0x1.c64p+2}, - {0x1.8fp-9, 0x1.7bcp-10}, {0x1.f14p-5, 0x1.52p-5}, - {0x1.e48p+15, 0x1.214p+14}, {0x1.fbp+5, 0x1.7c4p+5}, - {0x1.1fp-3, 0x1.c08p-5}, {0x1.248p+6, 0x1.838p+4}, - {0x1.65p+10, 0x1.fb8p+8}, {0x1.4c8p-5, 0x1.b6p-9}, - {0x1.a88p+11, 0x1.61cp+10}, {0x1.458p+5, 0x1.93p+2}, - {0x1.d18p+1, 0x1.de8p-1}, {0x1.6dp+1, 0x1.488p-1}, - {0x1.698p-5, 0x1.2d4p-6}, {0x1.3f8p-2, 0x1.df4p-3}, - {0x1.b3p-7, 0x1.878p-9}, {0x1.1b8p-5, 0x1.02cp-6}, - {0x1.518p-3, 0x1.1dp-6}, {0x1.198p+2, 0x1.a64p+1}, - {0x1.098p-7, 0x1.ba8p-9}, {0x1.b3p-8, 0x1.4acp-9}, - {0x1.a28p+4, 0x1.e8cp+3}, {0x1.41p+13, 0x1.768p+11}, - {0x1.cfp-14, 0x1.5b4p-14}, {0x1.31p-4, 0x1.128p-6}, - {0x1.83p-2, 0x1.148p-4}, {0x1.498p+15, 0x1.ee4p+14}, - {0x1.b6cp-3, 0x1.5ep-3}, {0x1.2a8p+7, 0x1.bfcp+6}, - {0x1.268p-5, 0x1.e3p-8}, {0x1.7cp-4, 0x1.068p-6}, - {0x1.8fp-4, 0x1.7bcp-5}, {0x1.95p-9, 0x1.ed8p-11}, - {0x1.29p+2, 0x1.2dcp+1}, {0x1.dbp-9, 0x1.998p-10}, - {0x1.b1p-10, 0x1.44cp-10}, {0x1.57p-9, 0x1.944p-10}, - {0x1.138p-9, 0x1.9d4p-10}, {0x1.d64p-8, 0x1.11p-8}, - {0x1.928p+6, 0x1.bd8p+4}, {0x1.2a8p+7, 0x1.f18p+5}, - {0x1.95p-6, 0x1.ed8p-8}, {0x1.998p-9, 0x1.75cp-10}, - {0x1.57p+9, 0x1.944p+8}, {0x1.998p+11, 0x1.fbp+8}, - {0x1.e3p-7, 0x1.a2cp-7}, {0x1.efp+8, 0x1.bd8p+6}, - {0x1.d74p+1, 0x1.a7p+1}, {0x1.f68p-13, 0x1.708p-15}, - {0x1.398p-8, 0x1.93cp-9}, {0x1.3d8p+1, 0x1.dc4p+0}, - {0x1.efp-1, 0x1.64p-6}, {0x1.02p-3, 0x1.3e4p-4}, - {0x1.a4p+5, 0x1.ce8p+3}, {0x1.83p-5, 0x1.148p-7}, - {0x1.adp-9, 0x1.93cp-10}, {0x1.7e8p-13, 0x1.188p-15}, - {0x1.248p+1, 0x1.838p-1}, {0x1.adp-10, 0x1.f48p-12}, - {0x1.ecp-2, 0x1.378p-4}, {0x1.998p-13, 0x1.fbp-16}, - {0x1.dbp-7, 0x1.86p-11}, {0x1.e3cp-10, 0x1.02p-10}, - {0x1.bfp+2, 0x1.4f4p+2}, {0x1.adp+7, 0x1.f48p+5}, - {0x1.6f8p+10, 0x1.0d8p+8}, {0x1.f4p+13, 0x1.e78p+12}, - {0x1.0d8p-9, 0x1.944p-10}, {0x1.3bp+8, 0x1.1cp+3}, - {0x1.c98p+10, 0x1.4f8p+8}, {0x1.9fp-10, 0x1.758p-12}, - {0x1.9c8p-4, 0x1.2e8p-6}, {0x1.d9p-1, 0x1.5cp-6}, - {0x1.ddp+11, 0x1.8d8p+10}, {0x1.308p-1, 0x1.79p-4}, - {0x1.9bp+12, 0x1.344p+12}, {0x1.d7p+12, 0x1.12cp+11}, - {0x1.e7p-13, 0x1.6d4p-13}, {0x1.518p+11, 0x1.bacp+10}, - {0x1.fep+11, 0x1.cbp+9}, {0x1.e3cp+2, 0x1.02p+2}, - {0x1.098p+0, 0x1.8e4p-1}, {0x1.538p-10, 0x1.fd4p-11}, - {0x1.858p-3, 0x1.dap-7}, {0x1.71p-12, 0x1.ae8p-14}, - {0x1.e3p-9, 0x1.34cp-9}, {0x1.ab8p+13, 0x1.69p+10}, - {0x1.1b8p+3, 0x1.a94p+2}, {0x1.f14p-12, 0x1.52p-12}, - {0x1.988p+13, 0x1.95p+10}, {0x1.998p+7, 0x1.e6p+3}, - {0x1.f68p+8, 0x1.708p+6}, {0x1.81p+15, 0x1.e84p+14}, - {0x1.ae8p+8, 0x1.0a8p+6}, {0x1.29p+10, 0x1.2dcp+9}, - {0x1.118p-8, 0x1.9a4p-9}, {0x1.59p+1, 0x1.368p-1}, - {0x1.efp+1, 0x1.9c8p+0}, {0x1.d7p-9, 0x1.614p-9}, - {0x1.4b8p-5, 0x1.6dp-8}, {0x1.4c8p-12, 0x1.9c8p-14}, - {0x1.f8p-13, 0x1.158p-14}, {0x1.41p+10, 0x1.768p+8}, - {0x1.29p-3, 0x1.2dcp-4}, {0x1.c08p-8, 0x1.75cp-9}, - {0x1.538p-7, 0x1.fd4p-8}, {0x1.518p-4, 0x1.fa4p-5}, - {0x1.2dp+4, 0x1.62cp+3}, {0x1.49p-9, 0x1.83cp-10}, - {0x1.6bp+3, 0x1.fap-1}, {0x1.efp+3, 0x1.734p+3}, - {0x1.038p-5, 0x1.b08p-7}, {0x1.f3p-3, 0x1.764p-3}, - {0x1.65p-7, 0x1.93cp-8}, {0x1.73p+13, 0x1.fa4p+12}, - {0x1.a1p+5, 0x1.38cp+5}, {0x1.9bp-10, 0x1.344p-10}, - {0x1.068p+13, 0x1.1ccp+12}, {0x1.d38p+15, 0x1.65p+12}, - {0x1.0ep+15, 0x1.074p+14}, {0x1.b2p+7, 0x1.d1p+4}, - {0x1.0a8p+4, 0x1.f68p+2}, {0x1.fccp+2, 0x1.bcp+2}, - {0x1.998p-10, 0x1.e6p-14}, {0x1.83p+10, 0x1.148p+8}, - {0x1.488p+5, 0x1.eccp+4}, {0x1.e3p-3, 0x1.a2cp-3}, - {0x1.1fp-4, 0x1.524p-5}, {0x1.428p-3, 0x1.da8p-5}, - {0x1.34p-6, 0x1.d88p-8}, {0x1.a28p+8, 0x1.e8cp+7}, - {0x1.348p+6, 0x1.cecp+5}, {0x1.65p+14, 0x1.734p+13}, - {0x1.59p-5, 0x1.928p-7}, {0x1.068p-11, 0x1.81p-14}, - {0x1.cep+14, 0x1.2b4p+13}, {0x1.188p+0, 0x1.248p-2}, - {0x1.8bp+9, 0x1.638p+7}, {0x1.4ap+12, 0x1.bacp+11}, - {0x1.e78p+12, 0x1.e98p+10}, {0x1.3bp+3, 0x1.1b8p+1}, - {0x1.268p-9, 0x1.e3p-12}, {0x1.28p-13, 0x1.59p-16}, - {0x1.efp+12, 0x1.814p+12}, {0x1.7e8p+2, 0x1.3ecp+1}, - {0x1.e1p+15, 0x1.4dcp+14}, {0x1.1e8p+14, 0x1.dd8p+12}, - {0x1.83p-4, 0x1.7d4p-4}, {0x1.65p+9, 0x1.734p+8}, - {0x1.72p+11, 0x1.68cp+10}, {0x1.848p-4, 0x1.43cp-5}, - {0x1.908p+13, 0x1.4dcp+12}, {0x1.f7cp-9, 0x1.98p-9}, - {0x1.efp+8, 0x1.814p+8}, {0x1.cf8p+3, 0x1.824p+2}, - {0x1.7cp-12, 0x1.068p-14}, {0x1.adp-11, 0x1.f48p-13}, - {0x1.a4p+9, 0x1.b2p+5}, {0x1.178p+12, 0x1.254p+11}, - {0x1.d1p+11, 0x1.a4cp+10}, {0x1.7b8p+10, 0x1.e8cp+9}, - {0x1.b3p+13, 0x1.464p+13}, {0x1.a28p+8, 0x1.5ccp+7}, - {0x1.288p+7, 0x1.bccp+6}, {0x1.bfp+3, 0x1.4f4p+3}, - {0x1.d1p+13, 0x1.a4cp+12}, {0x1.038p+1, 0x1.b08p-1}, - {0x1.bd8p+7, 0x1.c8cp+6}, {0x1.bdp+10, 0x1.4dcp+10}, - {0x1.bap-12, 0x1.be4p-13}, {0x1.efp+4, 0x1.59p+1}, - {0x1.3bp+9, 0x1.1b8p+7}, {0x1.c7p-10, 0x1.944p-11}, - {0x1.86p+14, 0x1.3cp+9}, {0x1.26p-11, 0x1.3bp-14}, - {0x1.a9p+2, 0x1.158p+0}, {0x1.3bp-5, 0x1.734p-6}, - {0x1.6cp+13, 0x1.308p+11}, {0x1.83p-6, 0x1.7d4p-6}, - {0x1.008p-13, 0x1.658p-15}, {0x1.b18p+3, 0x1.694p+2}, - {0x1.11p+10, 0x1.41cp+9}, {0x1.9dp-8, 0x1.e6cp-9}, - {0x1.2dp+3, 0x1.0a4p+2}, {0x1.5f8p-7, 0x1.2cp-12}, - {0x1.248p-7, 0x1.368p-9}, {0x1.d7cp+6, 0x1.95p+6}, - {0x1.fep-12, 0x1.4dp-14}, {0x1.158p-5, 0x1.a04p-6}, - {0x1.378p-10, 0x1.d34p-11}, {0x1.e7p+10, 0x1.6d4p+10}, - {0x1.208p-9, 0x1.b0cp-10}, {0x1.c7p-14, 0x1.554p-14}, - {0x1.38p-13, 0x1.f1p-16}, {0x1.278p+1, 0x1.ec8p-1}, - {0x1.7e8p+13, 0x1.5ep+9}, {0x1.95p+7, 0x1.6c8p+5}, - {0x1.c2p+11, 0x1.b6cp+10}, {0x1.fdp-7, 0x1.7dcp-7}, - {0x1.428p+4, 0x1.d9p+1}, {0x1.ddcp-3, 0x1.dcp-4}, - {0x1.adp+13, 0x1.93cp+12}, {0x1.e14p-5, 0x1.c2p-6}, - {0x1.608p+5, 0x1.028p+3}, {0x1.518p+11, 0x1.1dp+8}, - {0x1.f2cp-12, 0x1.dbp-12}, {0x1.ab8p+9, 0x1.644p+8}, - {0x1.e6p+7, 0x1.cbp+4}, {0x1.e84p+9, 0x1.d1p+9}, - {0x1.458p-10, 0x1.93p-13}, {0x1.068p-10, 0x1.81p-13}, - {0x1.59p+0, 0x1.e14p-1}, {0x1.2e8p+15, 0x1.c5cp+14}, - {0x1.a1p+9, 0x1.38cp+9}, {0x1.d64p-11, 0x1.11p-11}, - {0x1.488p+0, 0x1.11cp-1}, {0x1.7ap-13, 0x1.65p-16}, - {0x1.96p-4, 0x1.b3p-7}, {0x1.8ecp+11, 0x1.5cp+11}, - {0x1.3fp-11, 0x1.11cp-12}, {0x1.3bp-13, 0x1.ecp-18}, - {0x1.ce8p-8, 0x1.1acp-9}, {0x1.a28p-13, 0x1.ddcp-14}, - {0x1.488p+4, 0x1.11cp+3}, {0x1.228p+9, 0x1.b3cp+8}, - {0x1.298p+15, 0x1.14p+10}, {0x1.ccp+10, 0x1.0bcp+10}, - {0x1.efp+6, 0x1.814p+6}, {0x1.8d8p+3, 0x1.4b4p+2}, - {0x1.0ep+1, 0x1.6a4p+0}, {0x1.8f8p+0, 0x1.074p-1}, - {0x1.368p+12, 0x1.02cp+11}, {0x1.59p-4, 0x1.83p-7}, - {0x1.efp+7, 0x1.848p+6}, {0x1.998p-5, 0x1.554p-6}, - {0x1.65p+0, 0x1.c64p-1}, {0x1.29p+8, 0x1.9ep+4}, - {0x1.9ap+3, 0x1.404p+3}, {0x1.368p-10, 0x1.338p-12}, - {0x1.e3p+0, 0x1.a2cp+0}, {0x1.8fp+6, 0x1.d64p+5}, - {0x1.5a8p+12, 0x1.3c4p+11}, {0x1.e48p-7, 0x1.214p-8}, - {0x1.378p-5, 0x1.d34p-6}, {0x1.ebp-8, 0x1.704p-8}, - {0x1.5a8p+5, 0x1.634p+4}, {0x1.e3p-9, 0x1.928p-10}, - {0x1.258p+7, 0x1.b84p+6}, {0x1.5a8p-4, 0x1.20cp-5}, - {0x1.08p-9, 0x1.04p-14}, {0x1.188p-3, 0x1.0cp-8}, - {0x1.fep-10, 0x1.4dp-12}, {0x1.4c8p-6, 0x1.f2cp-7}, - {0x1.aep-11, 0x1.a34p-12}, {0x1.3a8p-7, 0x1.d7cp-8}, - {0x1.fd4p-3, 0x1.e5p-3}, {0x1.068p+14, 0x1.22p+10}, - {0x1.71p+7, 0x1.81p+4}, {0x1.1c8p-12, 0x1.aacp-13}, - {0x1.c5p+7, 0x1.084p+6}, {0x1.dcp-4, 0x1.89cp-4}, - {0x1.7e8p-7, 0x1.b28p-9}, {0x1.fep+7, 0x1.4dp+5}, - {0x1.068p+9, 0x1.7e8p+7}, {0x1.59p+7, 0x1.e14p+6}, - {0x1.7ap+12, 0x1.65p+9}, {0x1.158p-11, 0x1.ce8p-13}, - {0x1.adp+8, 0x1.6dcp+8}, {0x1.008p+2, 0x1.80cp+1}, - {0x1.4d8p+9, 0x1.3ecp+8}, {0x1.4b8p+6, 0x1.144p+5}, - {0x1.59p-6, 0x1.e14p-7}, {0x1.1b8p-9, 0x1.8fcp-10}, - {0x1.b9p+14, 0x1.4acp+14}, {0x1.378p-13, 0x1.d34p-14}, - {0x1.f2cp+1, 0x1.dcp-1}, {0x1.be8p-6, 0x1.7e8p-8}, - {0x1.878p+11, 0x1.464p+10}, {0x1.c9p+12, 0x1.56cp+12}, - {0x1.3e8p-12, 0x1.7ap-16}, {0x1.7e8p-10, 0x1.b28p-12}, - {0x1.28p+10, 0x1.59p+7}, {0x1.c2p-11, 0x1.be4p-11}, - {0x1.d4p+1, 0x1.314p+1}, {0x1.ab8p-12, 0x1.69p-15}, - {0x1.e9p+5, 0x1.978p+4}, {0x1.3f8p-4, 0x1.df4p-5}, - {0x1.c2p+6, 0x1.26p+2}, {0x1.5a8p-7, 0x1.3c4p-8}, - {0x1.f2cp-3, 0x1.fap-4}, {0x1.aa4p-11, 0x1.74p-11}, - {0x1.89cp-10, 0x1.4ap-10}, {0x1.928p+7, 0x1.a04p+6}, - {0x1.878p-11, 0x1.464p-12}, {0x1.0b8p+14, 0x1.914p+13}, - {0x1.f2cp-1, 0x1.fap-2}, {0x1.fep+7, 0x1.6a8p+6}, - {0x1.c08p+10, 0x1.298p+8}, {0x1.2a8p+13, 0x1.bfcp+12}, - {0x1.d5p+10, 0x1.5fcp+10}, {0x1.96p+3, 0x1.b3p+0}, - {0x1.f44p-7, 0x1.d4p-9}, {0x1.efp+3, 0x1.814p+3}, - {0x1.bfp-5, 0x1.4f4p-5}, {0x1.4c8p+0, 0x1.9c8p-2}, - {0x1.de8p+11, 0x1.0bcp+10}, {0x1.59p-8, 0x1.83p-11}, - {0x1.028p-5, 0x1.83cp-6}, {0x1.f8p-10, 0x1.158p-11}, - {0x1.b3p+11, 0x1.464p+11}, {0x1.1b8p+7, 0x1.a94p+6}, - {0x1.13p+14, 0x1.47cp+13}, {0x1.e78p+11, 0x1.658p+9}, - {0x1.098p+15, 0x1.ba8p+13}, {0x1.878p+13, 0x1.464p+12}, - {0x1.4dp+1, 0x1.24p-4}, {0x1.ab8p+12, 0x1.644p+11}, - {0x1.968p-3, 0x1.52cp-4}, {0x1.de8p+10, 0x1.0bcp+9}, - {0x1.adp-10, 0x1.a04p-10}, {0x1.7cp-3, 0x1.734p-3}, - {0x1.b3p-9, 0x1.878p-11}, {0x1.d18p+9, 0x1.20cp+8}, - {0x1.1b8p-12, 0x1.5fp-15}, {0x1.81p+12, 0x1.c5cp+11}, - {0x1.13p-8, 0x1.47cp-9}, {0x1.7e8p+5, 0x1.188p+3}, - {0x1.d9p-5, 0x1.554p-5}, {0x1.d5p+0, 0x1.5fcp+0}, - {0x1.f7cp-4, 0x1.efp-4}, {0x1.cdp+1, 0x1.59cp+1}, - {0x1.abp+0, 0x1.f74p-1}, {0x1.81p-5, 0x1.638p-7}, - {0x1.d8cp+2, 0x1.59p+2}, {0x1.cep+7, 0x1.75cp+7}, - {0x1.9dp+12, 0x1.35cp+12}, {0x1.22p-6, 0x1.7b8p-8}, - {0x1.83p+0, 0x1.7d4p+0}, {0x1.3e8p-11, 0x1.ddcp-12}, - {0x1.a28p+1, 0x1.5ccp+0}, {0x1.848p-5, 0x1.43cp-6}, - {0x1.f7cp-7, 0x1.efp-7}, {0x1.d7p+13, 0x1.12cp+12}, - {0x1.d3p+5, 0x1.5e4p+5}, {0x1.efp-9, 0x1.848p-10}, - {0x1.848p+2, 0x1.43cp+1}, {0x1.e3p+0, 0x1.928p-1}, - {0x1.098p-8, 0x1.ba8p-10}, {0x1.d34p-7, 0x1.bdp-7}, - {0x1.3f8p-12, 0x1.0a4p-13}, {0x1.e3p+7, 0x1.19cp+6}, - {0x1.02p+8, 0x1.3e4p+7}, {0x1.d9p-9, 0x1.62cp-9}, - {0x1.a28p-7, 0x1.ddcp-8}, {0x1.c98p+9, 0x1.7d4p+8}, - {0x1.1dp+5, 0x1.008p+3}, {0x1.9ap+0, 0x1.8fcp-1}, - {0x1.9ep-11, 0x1.1ap-15}, {0x1.81p-4, 0x1.5a8p-6}, - {0x1.218p+13, 0x1.e28p+11}, {0x1.608p+6, 0x1.474p+5}, - {0x1.49p+2, 0x1.83cp+1}, {0x1.258p+1, 0x1.b84p+0}, - {0x1.e14p-8, 0x1.b9p-8}, {0x1.7f4p-9, 0x1.6dp-9}, - {0x1.76p-9, 0x1.e48p-11}, {0x1.56p-9, 0x1.428p-11}, - {0x1.57p-12, 0x1.944p-13}, {0x1.ae8p-9, 0x1.4cp-14}, - {0x1.4dp-10, 0x1.24p-15}, {0x1.668p+3, 0x1.2acp+2}, - {0x1.238p-11, 0x1.b54p-12}, {0x1.9dp-11, 0x1.35cp-11}, - {0x1.368p-12, 0x1.d1cp-13}, {0x1.c5p+10, 0x1.53cp+10}, - {0x1.3bp-7, 0x1.1cp-12}, {0x1.338p+2, 0x1.cd4p+1}, - {0x1.e3p+13, 0x1.6a4p+13}, {0x1.cep-2, 0x1.efp-5}, - {0x1.848p+9, 0x1.43cp+8}, {0x1.998p+14, 0x1.75cp+13}, - {0x1.9f8p-2, 0x1.5a4p-3}, {0x1.c3p+5, 0x1.2b4p+5}, - {0x1.8fp-2, 0x1.7bcp-3}, {0x1.3c8p-3, 0x1.07cp-4}, - {0x1.83p+6, 0x1.7d4p+6}, {0x1.81p+10, 0x1.c5cp+9}, - {0x1.05p+3, 0x1.c7p+0}, {0x1.098p+14, 0x1.ba8p+12}, - {0x1.28p-11, 0x1.59p-14}, {0x1.e84p+2, 0x1.d1p+2}, - {0x1.9c8p+14, 0x1.a7p+11}, {0x1.4e8p+6, 0x1.f5cp+5}, - {0x1.358p-12, 0x1.d04p-13}, {0x1.158p+9, 0x1.d5p+6}, - {0x1.e78p-6, 0x1.02cp-7}, {0x1.a1p-9, 0x1.e68p-11}, - {0x1.458p+9, 0x1.e84p+8}, {0x1.ae8p+9, 0x1.4cp+4}, - {0x1.518p-9, 0x1.194p-10}, {0x1.79p-12, 0x1.d1cp-13}, - {0x1.068p-3, 0x1.22p-7}, {0x1.b7p-1, 0x1.494p-1}, - {0x1.fep-5, 0x1.6a8p-6}, {0x1.b5p+6, 0x1.47cp+6}, - {0x1.de8p-8, 0x1.0bcp-9}, {0x1.6d8p+4, 0x1.5a8p+2}, - {0x1.878p+14, 0x1.83cp+13}, {0x1.ba8p-8, 0x1.70cp-9}, - {0x1.bcp-3, 0x1.d38p-5}, {0x1.a28p+6, 0x1.e8cp+5}, - {0x1.cbp+12, 0x1.464p+11}, {0x1.13p-11, 0x1.5ccp-12}, - {0x1.1dp+6, 0x1.4c8p+4}, {0x1.74cp+7, 0x1.63p+7}, - {0x1.eap-13, 0x1.068p-15}, {0x1.068p+5, 0x1.aa4p+4}, - {0x1.8bp-9, 0x1.638p-11}, {0x1.e3p-5, 0x1.f38p-6}, - {0x1.abcp+10, 0x1.4ap+10}, {0x1.9c8p-6, 0x1.3bp-9}, - {0x1.c28p+6, 0x1.9d4p+5}, {0x1.57p+12, 0x1.944p+11}, - {0x1.34p+1, 0x1.d88p-1}, {0x1.0ap-13, 0x1.1dp-16}, - {0x1.3e8p+9, 0x1.ddcp+8}, {0x1.e3p+1, 0x1.19cp+0}, - {0x1.c2p-7, 0x1.8ecp-7}, {0x1.2dp+12, 0x1.62cp+11}, - {0x1.028p+12, 0x1.af4p+11}, {0x1.e9p+1, 0x1.1d4p+0}, - {0x1.578p-6, 0x1.1e4p-7}, {0x1.c28p-13, 0x1.9d4p-14}, - {0x1.188p+7, 0x1.d38p+5}, {0x1.908p+10, 0x1.4dcp+9}, - {0x1.338p-3, 0x1.cd4p-4}, {0x1.1d8p+0, 0x1.ac4p-1}, - {0x1.a1p-8, 0x1.e68p-10}, {0x1.f2cp-9, 0x1.a2p-9}, - {0x1.218p+7, 0x1.e28p+5}, {0x1.c2p-10, 0x1.964p-10}, - {0x1.f4p+7, 0x1.e78p+6}, {0x1.cc8p+12, 0x1.7fcp+11}, - {0x1.9dp-3, 0x1.e6cp-4}, {0x1.4c8p-4, 0x1.e48p-6}, - {0x1.f8p-5, 0x1.324p-5}, {0x1.cep-2, 0x1.2b4p-3}, - {0x1.838p+12, 0x1.80cp+11}, {0x1.45p-2, 0x1.248p-4}, - {0x1.ccp-14, 0x1.0bcp-14}, {0x1.4ap+8, 0x1.ffp+5}, - {0x1.8d8p-5, 0x1.238p-7}, {0x1.648p+6, 0x1.20cp+5}, - {0x1.b48p-13, 0x1.6bcp-14}, {0x1.0ep+4, 0x1.fep+0}, - {0x1.458p-7, 0x1.e84p-8}, {0x1.2b8p+15, 0x1.c14p+14}, - {0x1.4b8p+15, 0x1.e14p+14}, {0x1.3a8p+0, 0x1.aap-4}, - {0x1.77p-7, 0x1.b58p-9}, {0x1.83p+14, 0x1.c38p+12}, - {0x1.2a8p-12, 0x1.bfcp-13}, {0x1.ed8p+8, 0x1.bdp+5}, - {0x1.d58p-10, 0x1.874p-11}, {0x1.e78p-7, 0x1.e98p-9}, - {0x1.a98p+3, 0x1.758p+1}, {0x1.038p-10, 0x1.b08p-12}, - {0x1.4c8p-8, 0x1.c8cp-9}, {0x1.5a8p-2, 0x1.634p-3}, - {0x1.9c8p-11, 0x1.57cp-12}, {0x1.6a8p-11, 0x1.9ecp-12}, - {0x1.70cp+4, 0x1.65p+4}, {0x1.a98p+10, 0x1.758p+8}, - {0x1.d28p+15, 0x1.84cp+14}, {0x1.d64p+4, 0x1.11p+4}, - {0x1.848p+6, 0x1.43cp+5}, {0x1.c3p-3, 0x1.fep-7}, - {0x1.8fp-6, 0x1.5ecp-6}, {0x1.ab8p+3, 0x1.69p+0}, - {0x1.028p-2, 0x1.af4p-3}, {0x1.ccp-2, 0x1.0bcp-2}, - {0x1.c98p-5, 0x1.7d4p-6}, {0x1.8fp+1, 0x1.d18p-1}, - {0x1.be4p+12, 0x1.76p+12}, {0x1.a58p-9, 0x1.5f4p-10}, - {0x1.f2cp+6, 0x1.56p+5}, {0x1.86p+6, 0x1.82cp+6}, - {0x1.458p+7, 0x1.93p+4}, {0x1.3bp+0, 0x1.644p-1}, - {0x1.9bp+6, 0x1.df8p+4}, {0x1.b58p+2, 0x1.3ecp+1}, - {0x1.788p+6, 0x1.39cp+5}, {0x1.068p+5, 0x1.b58p+3}, - {0x1.bcp+9, 0x1.d38p+7}, {0x1.e14p-13, 0x1.b9p-13}, - {0x1.e6p+5, 0x1.b6cp+5}, {0x1.cep+13, 0x1.2b4p+12}, - {0x1.908p+1, 0x1.4dcp+0}, {0x1.e5p-8, 0x1.b48p-10}, - {0x1.d34p+9, 0x1.bdp+9}, {0x1.4b8p+3, 0x1.e14p+2}, - {0x1.3c8p+2, 0x1.dacp+1}, {0x1.4dp-5, 0x1.848p-7}, - {0x1.49p-1, 0x1.644p-2}, {0x1.efp+6, 0x1.fb8p+5}, - {0x1.288p-5, 0x1.bccp-6}, {0x1.9c8p+2, 0x1.57cp+1}, - {0x1.81p-6, 0x1.c5cp-7}, {0x1.57p+2, 0x1.944p+1}, - {0x1.4ap-12, 0x1.ffp-15}, {0x1.1dp-1, 0x1.4c8p-3}, - {0x1.a2p+13, 0x1.89cp+13}, {0x1.218p-12, 0x1.b24p-13}, - {0x1.3f8p-5, 0x1.0a4p-6}, {0x1.9ap+15, 0x1.44p+10}, - {0x1.a9p-11, 0x1.7e8p-13}, {0x1.23p-3, 0x1.538p-5}, - {0x1.59p-10, 0x1.928p-12}, {0x1.89cp-5, 0x1.77p-5}, - {0x1.c2p-4, 0x1.8ecp-4}, {0x1.218p-7, 0x1.b24p-8}, - {0x1.ed8p-2, 0x1.bdp-5}, {0x1.fep-8, 0x1.298p-9}, - {0x1.e78p-2, 0x1.32p-6}, {0x1.3f8p-2, 0x1.0a4p-3}, - {0x1.bacp-5, 0x1.65p-5}, {0x1.308p-5, 0x1.e3cp-6}, - {0x1.d1p-12, 0x1.a4cp-13}, {0x1.368p+1, 0x1.02cp+0}, - {0x1.2d8p-11, 0x1.f68p-13}, {0x1.9ecp+2, 0x1.8bp+2}, - {0x1.338p+8, 0x1.cd4p+7}, {0x1.8bp-7, 0x1.638p-9}, - {0x1.d88p+5, 0x1.5a8p+3}, {0x1.4ap-6, 0x1.ffp-9}, - {0x1.e9p+7, 0x1.978p+6}, {0x1.128p+1, 0x1.9bcp+0}, - {0x1.56p+8, 0x1.43p+5}, {0x1.298p+11, 0x1.4acp+10}, - {0x1.368p-10, 0x1.5acp-11}, {0x1.3a8p-12, 0x1.aap-16}, - {0x1.77p-1, 0x1.b58p-3}, {0x1.6f8p-10, 0x1.774p-11}, - {0x1.928p+13, 0x1.a04p+12}, {0x1.f2cp+6, 0x1.dbp+6}, - {0x1.5a8p+7, 0x1.adp+4}, {0x1.b2p-7, 0x1.d1p-10}, - {0x1.e3cp+9, 0x1.02p+9}, {0x1.35p-8, 0x1.688p-10}, - {0x1.9dp-4, 0x1.35cp-4}, {0x1.a4p+14, 0x1.ce8p+12}, - {0x1.d18p+11, 0x1.de8p+9}, {0x1.318p+6, 0x1.ca4p+5}, - {0x1.298p-3, 0x1.be4p-4}, {0x1.2cp+0, 0x1.36p-4}, - {0x1.2dp+9, 0x1.0a4p+8}, {0x1.c08p+12, 0x1.b9p+9}, - {0x1.f7p-1, 0x1.794p-1}, {0x1.ce8p-4, 0x1.1acp-5}, - {0x1.76p+15, 0x1.e48p+13}, {0x1.31p+2, 0x1.128p+0}, - {0x1.338p-2, 0x1.868p-4}, {0x1.e3cp-10, 0x1.2dp-10}, - {0x1.e78p-10, 0x1.02cp-11}, {0x1.d7p-1, 0x1.12cp-2}, - {0x1.81p-2, 0x1.5a8p-4}, {0x1.ffp-5, 0x1.7f4p-5}, - {0x1.6f8p-7, 0x1.c7p-10}, {0x1.f7cp-11, 0x1.98p-11}, - {0x1.b3p+12, 0x1.fb8p+10}, {0x1.4b8p+12, 0x1.224p+11}, - {0x1.8d8p-13, 0x1.dd4p-14}, {0x1.e14p+0, 0x1.c2p-1}, - {0x1.248p-2, 0x1.524p-3}, {0x1.a3p+12, 0x1.3a4p+12}, - {0x1.bdp-11, 0x1.4dcp-11}, {0x1.418p+0, 0x1.e24p-1}, - {0x1.fep-9, 0x1.6a8p-10}, {0x1.a98p-8, 0x1.758p-10}, - {0x1.1dp+11, 0x1.0f4p+10}, {0x1.5a8p+0, 0x1.20cp-1}, - {0x1.f2cp-3, 0x1.0ap-3}, {0x1.7e8p+15, 0x1.188p+13}, -}; - -#endif // LLVM_LIBC_TEST_SRC_MATH_HYPOTTEST_HARD_TO_ROUND_H diff --git a/libc/test/src/math/hypotf16_test.cpp b/libc/test/src/math/hypotf16_test.cpp index cdb6c345e9d7b..37d57471a3c74 100644 --- a/libc/test/src/math/hypotf16_test.cpp +++ b/libc/test/src/math/hypotf16_test.cpp @@ -7,7 +7,6 @@ //===----------------------------------------------------------------------===// #include "HypotTest.h" -#include "hypotf16_hard_to_round.h" #include "src/math/hypotf16.h" @@ -20,8 +19,3 @@ TEST_F(LlvmLibcHypotf16Test, SubnormalRange) { TEST_F(LlvmLibcHypotf16Test, NormalRange) { test_normal_range(&LIBC_NAMESPACE::hypotf16); } - -TEST_F(LlvmLibcHypotf16Test, TrickyInputs) { - test_input_list(&LIBC_NAMESPACE::hypotf16, N_HARD_TO_ROUND, - HYPOTF16_HARD_TO_ROUND); -} From ec505e5213bebdfb0f98e3a2b65e3d16b6879a4f Mon Sep 17 00:00:00 2001 From: meltq Date: Fri, 28 Mar 2025 15:31:10 +0530 Subject: [PATCH 14/21] Added negative exhaustive test --- .../src/math/exhaustive/hypotf16_test.cpp | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index bbd900a45031b..44ab3f76b7a10 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -15,20 +15,17 @@ namespace mpfr = LIBC_NAMESPACE::testing::mpfr; -// Range of both inputs: [0, inf] -static constexpr uint16_t START = 0x0000U; -static constexpr uint16_t STOP = 0x7C00U; - struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { using FloatType = float16; using FPBits = LIBC_NAMESPACE::fputil::FPBits; using StorageType = typename FPBits::StorageType; - uint64_t check(uint16_t start, uint16_t stop, mpfr::RoundingMode rounding) { + uint64_t check(uint16_t x_start, uint16_t x_stop, uint16_t y_start, + uint16_t y_stop, mpfr::RoundingMode rounding) { mpfr::ForceRoundingMode r(rounding); if (!r.success) return true; - uint16_t xbits = start; + uint16_t xbits = x_start; uint64_t failed = 0; do { float16 x = FPBits(xbits).get_val(); @@ -44,8 +41,8 @@ struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { // 0.5, // rounding); failed += (!correct); - } while (ybits++ < STOP); - } while (xbits++ < stop); + } while (ybits++ < y_stop); + } while (xbits++ < x_stop); return failed; } }; @@ -53,6 +50,18 @@ struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { using LlvmLibcHypotf16ExhaustiveTest = LlvmLibcExhaustiveMathTest; +// Range of both inputs: [0, inf] +static constexpr uint16_t POS_START = 0x0000U; +static constexpr uint16_t POS_STOP = 0x7C00U; + TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) { - test_full_range_all_roundings(START, STOP); + test_full_range_all_roundings(POS_START, POS_STOP, POS_START, POS_STOP); +} + +// Range of both inputs: [-0, -inf] +static constexpr uint16_t NEG_START = 0x8000U; +static constexpr uint16_t NEG_STOP = 0xFC00U; + +TEST_F(LlvmLibcHypotf16ExhaustiveTest, NegativeRange) { + test_full_range_all_roundings(NEG_START, NEG_STOP, NEG_START, NEG_STOP); } From a83e0b197ebf85c7375ff711a7ca51f8283bc248 Mon Sep 17 00:00:00 2001 From: meltq Date: Fri, 28 Mar 2025 17:15:26 +0530 Subject: [PATCH 15/21] Add explicit casts in Hypot --- libc/src/__support/FPUtil/Hypot.h | 6 +++--- libc/test/src/math/exhaustive/hypotf16_test.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libc/src/__support/FPUtil/Hypot.h b/libc/src/__support/FPUtil/Hypot.h index 6aa808446d6d9..1dcf917d5cd23 100644 --- a/libc/src/__support/FPUtil/Hypot.h +++ b/libc/src/__support/FPUtil/Hypot.h @@ -30,7 +30,7 @@ LIBC_INLINE T find_leading_one(T mant, int &shift_length) { if (mant > 0) { shift_length = (sizeof(mant) * 8) - 1 - cpp::countl_zero(mant); } - return T(1) << shift_length; + return (T)(T(1) << shift_length); } } // namespace internal @@ -207,8 +207,8 @@ LIBC_INLINE T hypot(T x, T y) { for (StorageType current_bit = leading_one >> 1; current_bit; current_bit >>= 1) { - r = (r << 1) + ((tail_bits & current_bit) ? 1 : 0); - StorageType tmp = (y_new << 1) + current_bit; // 2*y_new(n - 1) + 2^(-n) + r = (StorageType)(r << 1) + ((tail_bits & current_bit) ? 1 : 0); + StorageType tmp = (StorageType)(y_new << 1) + current_bit; // 2*y_new(n - 1) + 2^(-n) if (r >= tmp) { r -= tmp; y_new += current_bit; diff --git a/libc/test/src/math/exhaustive/hypotf16_test.cpp b/libc/test/src/math/exhaustive/hypotf16_test.cpp index 44ab3f76b7a10..f79041e6dbd77 100644 --- a/libc/test/src/math/exhaustive/hypotf16_test.cpp +++ b/libc/test/src/math/exhaustive/hypotf16_test.cpp @@ -32,7 +32,7 @@ struct Hypotf16Checker : public virtual LIBC_NAMESPACE::testing::Test { uint16_t ybits = xbits; do { float16 y = FPBits(ybits).get_val(); - bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y), + bool correct = TEST_FP_EQ(LIBC_NAMESPACE::fputil::hypot(x, y), LIBC_NAMESPACE::hypotf16(x, y)); // Using MPFR will be much slower. // mpfr::BinaryInput input{x, y}; From d4a6b4fc2f7ba45e50a7f1e24e9c016ee8affb7a Mon Sep 17 00:00:00 2001 From: meltq Date: Fri, 28 Mar 2025 17:18:10 +0530 Subject: [PATCH 16/21] Add back fputil::cast --- libc/src/math/generic/hypotf16.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp index 577f85769e66b..a7814418f75be 100644 --- a/libc/src/math/generic/hypotf16.cpp +++ b/libc/src/math/generic/hypotf16.cpp @@ -51,8 +51,8 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { << FPBits::FRACTION_LEN))) return x_abs.get_val() + y_abs.get_val(); - float af = static_cast(a_bits.get_val()); - float bf = static_cast(b_bits.get_val()); + float af = fputil::cast(a_bits.get_val()); + float bf = fputil::cast(b_bits.get_val()); // These squares are exact. float a_sq = af * af; @@ -81,7 +81,7 @@ LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { return fputil::cast(FloatBits(r_u).get_val()); } - return static_cast(result.get_val()); + return fputil::cast(result.get_val()); } } // namespace LIBC_NAMESPACE_DECL From ee4174896bdeefdc56b09ea47256ebf95caf00d7 Mon Sep 17 00:00:00 2001 From: meltq Date: Sat, 29 Mar 2025 02:22:26 +0530 Subject: [PATCH 17/21] Add comments regarding potential slow down --- libc/src/__support/FPUtil/cast.h | 2 ++ libc/src/math/generic/hypotf16.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/libc/src/__support/FPUtil/cast.h b/libc/src/__support/FPUtil/cast.h index 126f3852137b7..efdc3ccaa18a7 100644 --- a/libc/src/__support/FPUtil/cast.h +++ b/libc/src/__support/FPUtil/cast.h @@ -18,6 +18,8 @@ namespace LIBC_NAMESPACE::fputil { +// TODO: Add optimization for known good targets with fast +// float to float16 conversion: https://github.com/llvm/llvm-project/issues/133517 template LIBC_INLINE constexpr cpp::enable_if_t && cpp::is_floating_point_v, diff --git a/libc/src/math/generic/hypotf16.cpp b/libc/src/math/generic/hypotf16.cpp index a7814418f75be..8f80986204b27 100644 --- a/libc/src/math/generic/hypotf16.cpp +++ b/libc/src/math/generic/hypotf16.cpp @@ -18,6 +18,8 @@ namespace LIBC_NAMESPACE_DECL { +// For targets where conversion from float to float16 has to be +// emulated, fputil::hypot is faster LLVM_LIBC_FUNCTION(float16, hypotf16, (float16 x, float16 y)) { using FloatBits = fputil::FPBits; using FPBits = fputil::FPBits; From f72c7f2c1f4177c2275c1c2651f0d099acef2a9d Mon Sep 17 00:00:00 2001 From: meltq Date: Sat, 29 Mar 2025 02:29:17 +0530 Subject: [PATCH 18/21] Formatting changes --- libc/src/__support/FPUtil/cast.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libc/src/__support/FPUtil/cast.h b/libc/src/__support/FPUtil/cast.h index efdc3ccaa18a7..7578bb42b18f1 100644 --- a/libc/src/__support/FPUtil/cast.h +++ b/libc/src/__support/FPUtil/cast.h @@ -18,8 +18,9 @@ namespace LIBC_NAMESPACE::fputil { -// TODO: Add optimization for known good targets with fast -// float to float16 conversion: https://github.com/llvm/llvm-project/issues/133517 +// TODO: Add optimization for known good targets with fast +// float to float16 conversion: +// https://github.com/llvm/llvm-project/issues/133517 template LIBC_INLINE constexpr cpp::enable_if_t && cpp::is_floating_point_v, From 97a05b07e263d2a2bc8e5a7c071c837b2903a184 Mon Sep 17 00:00:00 2001 From: meltq Date: Sat, 29 Mar 2025 13:26:07 +0530 Subject: [PATCH 19/21] Formatting changes --- libc/src/__support/FPUtil/Hypot.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libc/src/__support/FPUtil/Hypot.h b/libc/src/__support/FPUtil/Hypot.h index 1dcf917d5cd23..fac10a23b51b9 100644 --- a/libc/src/__support/FPUtil/Hypot.h +++ b/libc/src/__support/FPUtil/Hypot.h @@ -208,7 +208,8 @@ LIBC_INLINE T hypot(T x, T y) { for (StorageType current_bit = leading_one >> 1; current_bit; current_bit >>= 1) { r = (StorageType)(r << 1) + ((tail_bits & current_bit) ? 1 : 0); - StorageType tmp = (StorageType)(y_new << 1) + current_bit; // 2*y_new(n - 1) + 2^(-n) + StorageType tmp = + (StorageType)(y_new << 1) + current_bit; // 2*y_new(n - 1) + 2^(-n) if (r >= tmp) { r -= tmp; y_new += current_bit; From 0f694e13c1dcdad178ec6c7fab05fe591063ebda Mon Sep 17 00:00:00 2001 From: meltq Date: Sun, 30 Mar 2025 13:13:07 +0530 Subject: [PATCH 20/21] Use static_cast --- libc/src/__support/FPUtil/Hypot.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libc/src/__support/FPUtil/Hypot.h b/libc/src/__support/FPUtil/Hypot.h index fac10a23b51b9..890cbdc9200a7 100644 --- a/libc/src/__support/FPUtil/Hypot.h +++ b/libc/src/__support/FPUtil/Hypot.h @@ -30,7 +30,7 @@ LIBC_INLINE T find_leading_one(T mant, int &shift_length) { if (mant > 0) { shift_length = (sizeof(mant) * 8) - 1 - cpp::countl_zero(mant); } - return (T)(T(1) << shift_length); + return static_cast((T(1) << shift_length)); } } // namespace internal @@ -207,9 +207,8 @@ LIBC_INLINE T hypot(T x, T y) { for (StorageType current_bit = leading_one >> 1; current_bit; current_bit >>= 1) { - r = (StorageType)(r << 1) + ((tail_bits & current_bit) ? 1 : 0); - StorageType tmp = - (StorageType)(y_new << 1) + current_bit; // 2*y_new(n - 1) + 2^(-n) + r = static_cast((r << 1)) + ((tail_bits & current_bit) ? 1 : 0); + StorageType tmp = static_cast((y_new << 1)) + current_bit; // 2*y_new(n - 1) + 2^(-n) if (r >= tmp) { r -= tmp; y_new += current_bit; From 668199d639ef9e7e2624dc7e8d8729c6ee29d252 Mon Sep 17 00:00:00 2001 From: meltq Date: Sun, 30 Mar 2025 13:14:09 +0530 Subject: [PATCH 21/21] Formatting changes --- libc/src/__support/FPUtil/Hypot.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libc/src/__support/FPUtil/Hypot.h b/libc/src/__support/FPUtil/Hypot.h index 890cbdc9200a7..94da259cd42f0 100644 --- a/libc/src/__support/FPUtil/Hypot.h +++ b/libc/src/__support/FPUtil/Hypot.h @@ -207,8 +207,10 @@ LIBC_INLINE T hypot(T x, T y) { for (StorageType current_bit = leading_one >> 1; current_bit; current_bit >>= 1) { - r = static_cast((r << 1)) + ((tail_bits & current_bit) ? 1 : 0); - StorageType tmp = static_cast((y_new << 1)) + current_bit; // 2*y_new(n - 1) + 2^(-n) + r = static_cast((r << 1)) + + ((tail_bits & current_bit) ? 1 : 0); + StorageType tmp = static_cast((y_new << 1)) + + current_bit; // 2*y_new(n - 1) + 2^(-n) if (r >= tmp) { r -= tmp; y_new += current_bit;