[libc-commits] [libc] [libc][math][c23] Add hypotf16() function (PR #131991)
Tejas Vipin via libc-commits
libc-commits at lists.llvm.org
Sun Mar 23 10:19:08 PDT 2025
https://github.com/meltq updated https://github.com/llvm/llvm-project/pull/131991
>From 08792d33933092bf25c1c059fe2fd402030ca5c5 Mon Sep 17 00:00:00 2001
From: meltq <alissxlace at proton.me>
Date: Wed, 19 Mar 2025 15:19:37 +0530
Subject: [PATCH 1/7] 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<float>;
+ using FPBits = fputil::FPBits<float16>;
+
+ 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<uint16_t>((FPBits::FRACTION_LEN + 2)
+ << FPBits::FRACTION_LEN)))
+ return x_abs.get_val() + y_abs.get_val();
+
+ float ad = fputil::cast<float>(a_bits.get_val());
+ float bd = fputil::cast<float>(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<float>(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<float16>(FloatBits(r_u).get_val());
+ }
+
+ return fputil::cast<float16>(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<float16>;
+ 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<float16> 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<Hypotf16Checker>;
+
+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<float16>;
+
+// 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<float16>;
+
+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 <alissxlace at proton.me>
Date: Wed, 19 Mar 2025 15:22:34 +0530
Subject: [PATCH 2/7] 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<float16>(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<Hypotf16Checker>;
+using LlvmLibcHypotf16ExhaustiveTest =
+ LlvmLibcExhaustiveMathTest<Hypotf16Checker>;
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<float16>;
@@ -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 <alissxlace at proton.me>
Date: Thu, 20 Mar 2025 11:15:17 +0530
Subject: [PATCH 3/7] 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<float16>;
- 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<float16> 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<Hypotf16Checker>;
-
-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<float16>;
+// 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<float16> 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<Hypotf16Checker>;
+//
+// TEST_F(LlvmLibcHypotf16ExhaustiveTest, PositiveRange) {
+// test_full_range_all_roundings(START, STOP);
+// }
>From 3395a6f5609c4169e42e2875e6bb9e9a544d8ba0 Mon Sep 17 00:00:00 2001
From: meltq <alissxlace at proton.me>
Date: Thu, 20 Mar 2025 11:19:22 +0530
Subject: [PATCH 4/7] 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<float16>;
// 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<float16> 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 <alissxlace at proton.me>
Date: Thu, 20 Mar 2025 15:19:01 +0530
Subject: [PATCH 5/7] 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<float16>;
-// 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 <alissxlace at proton.me>
Date: Thu, 20 Mar 2025 19:09:46 +0530
Subject: [PATCH 6/7] 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 <alissxlace at proton.me>
Date: Sun, 23 Mar 2025 22:46:34 +0530
Subject: [PATCH 7/7] 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<float16>;
-// 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<float16> 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<Hypotf16Checker>;
-//
-// 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<float16>;
+ 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<float16> 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<Hypotf16Checker>;
+
+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<float16> 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<float16>;
+using LlvmLibcHypotf16Test = HypotTestTemplate<float16>;
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);
}
More information about the libc-commits
mailing list