|
8 | 8 |
|
9 | 9 | #include "include/math.h"
|
10 | 10 | #include "src/math/ceil.h"
|
11 |
| -#include "utils/FPUtil/BitPatterns.h" |
12 |
| -#include "utils/FPUtil/FloatOperations.h" |
13 |
| -#include "utils/FPUtil/FloatProperties.h" |
| 11 | +#include "utils/FPUtil/FPBits.h" |
| 12 | +#include "utils/FPUtil/TestHelpers.h" |
14 | 13 | #include "utils/MPFRWrapper/MPFRUtils.h"
|
15 | 14 | #include "utils/UnitTest/Test.h"
|
16 | 15 |
|
17 |
| -using __llvm_libc::fputil::valueAsBits; |
18 |
| -using __llvm_libc::fputil::valueFromBits; |
19 |
| - |
20 |
| -using BitPatterns = __llvm_libc::fputil::BitPatterns<double>; |
21 |
| -using Properties = __llvm_libc::fputil::FloatProperties<double>; |
| 16 | +using FPBits = __llvm_libc::fputil::FPBits<double>; |
22 | 17 |
|
23 | 18 | namespace mpfr = __llvm_libc::testing::mpfr;
|
24 | 19 |
|
| 20 | +static const double zero = FPBits::zero(); |
| 21 | +static const double negZero = FPBits::negZero(); |
| 22 | +static const double nan = FPBits::buildNaN(1); |
| 23 | +static const double inf = FPBits::inf(); |
| 24 | +static const double negInf = FPBits::negInf(); |
| 25 | + |
25 | 26 | // Zero tolerance; As in, exact match with MPFR result.
|
26 |
| -static constexpr mpfr::Tolerance tolerance{mpfr::Tolerance::doublePrecision, 0, |
| 27 | +static constexpr mpfr::Tolerance tolerance{mpfr::Tolerance::floatPrecision, 0, |
27 | 28 | 0};
|
| 29 | +TEST(CeilTest, SpecialNumbers) { |
| 30 | + EXPECT_FP_EQ(zero, __llvm_libc::ceil(zero)); |
| 31 | + EXPECT_FP_EQ(negZero, __llvm_libc::ceil(negZero)); |
28 | 32 |
|
29 |
| -TEST(ceilTest, SpecialNumbers) { |
30 |
| - EXPECT_EQ( |
31 |
| - BitPatterns::aQuietNaN, |
32 |
| - valueAsBits(__llvm_libc::ceil(valueFromBits(BitPatterns::aQuietNaN)))); |
33 |
| - EXPECT_EQ(BitPatterns::aNegativeQuietNaN, |
34 |
| - valueAsBits(__llvm_libc::ceil( |
35 |
| - valueFromBits(BitPatterns::aNegativeQuietNaN)))); |
36 |
| - |
37 |
| - EXPECT_EQ(BitPatterns::aSignallingNaN, |
38 |
| - valueAsBits( |
39 |
| - __llvm_libc::ceil(valueFromBits(BitPatterns::aSignallingNaN)))); |
40 |
| - EXPECT_EQ(BitPatterns::aNegativeSignallingNaN, |
41 |
| - valueAsBits(__llvm_libc::ceil( |
42 |
| - valueFromBits(BitPatterns::aNegativeSignallingNaN)))); |
| 33 | + EXPECT_FP_EQ(inf, __llvm_libc::ceil(inf)); |
| 34 | + EXPECT_FP_EQ(negInf, __llvm_libc::ceil(negInf)); |
43 | 35 |
|
44 |
| - EXPECT_EQ(BitPatterns::inf, |
45 |
| - valueAsBits(__llvm_libc::ceil(valueFromBits(BitPatterns::inf)))); |
46 |
| - EXPECT_EQ(BitPatterns::negInf, |
47 |
| - valueAsBits(__llvm_libc::ceil(valueFromBits(BitPatterns::negInf)))); |
| 36 | + ASSERT_NE(isnan(nan), 0); |
| 37 | + ASSERT_NE(isnan(__llvm_libc::ceil(nan)), 0); |
| 38 | +} |
48 | 39 |
|
49 |
| - EXPECT_EQ(BitPatterns::zero, |
50 |
| - valueAsBits(__llvm_libc::ceil(valueFromBits(BitPatterns::zero)))); |
51 |
| - EXPECT_EQ(BitPatterns::negZero, valueAsBits(__llvm_libc::ceil( |
52 |
| - valueFromBits(BitPatterns::negZero)))); |
| 40 | +TEST(CeilTest, RoundedNumbers) { |
| 41 | + EXPECT_FP_EQ(1.0, __llvm_libc::ceil(1.0)); |
| 42 | + EXPECT_FP_EQ(-1.0, __llvm_libc::ceil(-1.0)); |
| 43 | + EXPECT_FP_EQ(10.0, __llvm_libc::ceil(10.0)); |
| 44 | + EXPECT_FP_EQ(-10.0, __llvm_libc::ceil(-10.0)); |
| 45 | + EXPECT_FP_EQ(1234.0, __llvm_libc::ceil(1234.0)); |
| 46 | + EXPECT_FP_EQ(-1234.0, __llvm_libc::ceil(-1234.0)); |
53 | 47 | }
|
54 | 48 |
|
55 |
| -TEST(ceilTest, RoundedNumbers) { |
56 |
| - EXPECT_EQ(valueAsBits(1.0), valueAsBits(__llvm_libc::ceil(1.0))); |
57 |
| - EXPECT_EQ(valueAsBits(-1.0), valueAsBits(__llvm_libc::ceil(-1.0))); |
58 |
| - EXPECT_EQ(valueAsBits(10.0), valueAsBits(__llvm_libc::ceil(10.0))); |
59 |
| - EXPECT_EQ(valueAsBits(-10.0), valueAsBits(__llvm_libc::ceil(-10.0))); |
60 |
| - EXPECT_EQ(valueAsBits(12345.0), valueAsBits(__llvm_libc::ceil(12345.0))); |
61 |
| - EXPECT_EQ(valueAsBits(-12345.0), valueAsBits(__llvm_libc::ceil(-12345.0))); |
| 49 | +TEST(CeilTest, Fractions) { |
| 50 | + EXPECT_FP_EQ(1.0, __llvm_libc::ceil(0.5)); |
| 51 | + EXPECT_FP_EQ(-0.0, __llvm_libc::ceil(-0.5)); |
| 52 | + EXPECT_FP_EQ(1.0, __llvm_libc::ceil(0.115)); |
| 53 | + EXPECT_FP_EQ(-0.0, __llvm_libc::ceil(-0.115)); |
| 54 | + EXPECT_FP_EQ(1.0, __llvm_libc::ceil(0.715)); |
| 55 | + EXPECT_FP_EQ(-0.0, __llvm_libc::ceil(-0.715)); |
| 56 | + EXPECT_FP_EQ(2.0, __llvm_libc::ceil(1.3)); |
| 57 | + EXPECT_FP_EQ(-1.0, __llvm_libc::ceil(-1.3)); |
| 58 | + EXPECT_FP_EQ(2.0, __llvm_libc::ceil(1.5)); |
| 59 | + EXPECT_FP_EQ(-1.0, __llvm_libc::ceil(-1.5)); |
| 60 | + EXPECT_FP_EQ(2.0, __llvm_libc::ceil(1.75)); |
| 61 | + EXPECT_FP_EQ(-1.0, __llvm_libc::ceil(-1.75)); |
| 62 | + EXPECT_FP_EQ(11.0, __llvm_libc::ceil(10.32)); |
| 63 | + EXPECT_FP_EQ(-10.0, __llvm_libc::ceil(-10.32)); |
| 64 | + EXPECT_FP_EQ(11.0, __llvm_libc::ceil(10.65)); |
| 65 | + EXPECT_FP_EQ(-10.0, __llvm_libc::ceil(-10.65)); |
| 66 | + EXPECT_FP_EQ(1235.0, __llvm_libc::ceil(1234.38)); |
| 67 | + EXPECT_FP_EQ(-1234.0, __llvm_libc::ceil(-1234.38)); |
| 68 | + EXPECT_FP_EQ(1235.0, __llvm_libc::ceil(1234.96)); |
| 69 | + EXPECT_FP_EQ(-1234.0, __llvm_libc::ceil(-1234.96)); |
62 | 70 | }
|
63 | 71 |
|
64 |
| -TEST(ceilTest, InDoubleRange) { |
65 |
| - using BitsType = Properties::BitsType; |
66 |
| - constexpr BitsType count = 1000000; |
67 |
| - constexpr BitsType step = UINT64_MAX / count; |
68 |
| - for (BitsType i = 0, v = 0; i <= count; ++i, v += step) { |
69 |
| - double x = valueFromBits(v); |
| 72 | +TEST(CeilTest, InDoubleRange) { |
| 73 | + using UIntType = FPBits::UIntType; |
| 74 | + constexpr UIntType count = 10000000; |
| 75 | + constexpr UIntType step = UIntType(-1) / count; |
| 76 | + for (UIntType i = 0, v = 0; i <= count; ++i, v += step) { |
| 77 | + double x = FPBits(v); |
70 | 78 | if (isnan(x) || isinf(x))
|
71 | 79 | continue;
|
| 80 | + |
72 | 81 | ASSERT_MPFR_MATCH(mpfr::Operation::Ceil, x, __llvm_libc::ceil(x),
|
73 | 82 | tolerance);
|
74 | 83 | }
|
|
0 commit comments