1*dc72be4eSSiva Chandra Reddy //===-- Unittests for modff -----------------------------------------------===//
2118c13c6SSiva Chandra Reddy //
3118c13c6SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4118c13c6SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5118c13c6SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6118c13c6SSiva Chandra Reddy //
7118c13c6SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8118c13c6SSiva Chandra Reddy 
9118c13c6SSiva Chandra Reddy #include "include/math.h"
10118c13c6SSiva Chandra Reddy #include "src/math/modff.h"
116fb7f3a3SSiva Chandra Reddy #include "utils/FPUtil/BasicOperations.h"
12118c13c6SSiva Chandra Reddy #include "utils/FPUtil/BitPatterns.h"
13118c13c6SSiva Chandra Reddy #include "utils/FPUtil/FloatOperations.h"
14118c13c6SSiva Chandra Reddy #include "utils/FPUtil/FloatProperties.h"
156fb7f3a3SSiva Chandra Reddy #include "utils/FPUtil/NearestIntegerOperations.h"
16118c13c6SSiva Chandra Reddy #include "utils/UnitTest/Test.h"
17118c13c6SSiva Chandra Reddy 
18118c13c6SSiva Chandra Reddy using __llvm_libc::fputil::valueAsBits;
19118c13c6SSiva Chandra Reddy using __llvm_libc::fputil::valueFromBits;
20118c13c6SSiva Chandra Reddy 
21118c13c6SSiva Chandra Reddy using BitPatterns = __llvm_libc::fputil::BitPatterns<float>;
22118c13c6SSiva Chandra Reddy using Properties = __llvm_libc::fputil::FloatProperties<float>;
23118c13c6SSiva Chandra Reddy 
24118c13c6SSiva Chandra Reddy TEST(ModffTest, SpecialNumbers) {
25118c13c6SSiva Chandra Reddy   float integral;
26118c13c6SSiva Chandra Reddy 
27118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::aQuietNaN,
28118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(
29118c13c6SSiva Chandra Reddy                 valueFromBits(BitPatterns::aQuietNaN), &integral)));
30118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::aNegativeQuietNaN,
31118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(
32118c13c6SSiva Chandra Reddy                 valueFromBits(BitPatterns::aNegativeQuietNaN), &integral)));
33118c13c6SSiva Chandra Reddy 
34118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::aSignallingNaN,
35118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(
36118c13c6SSiva Chandra Reddy                 valueFromBits(BitPatterns::aSignallingNaN), &integral)));
37118c13c6SSiva Chandra Reddy   EXPECT_EQ(
38118c13c6SSiva Chandra Reddy       BitPatterns::aNegativeSignallingNaN,
39118c13c6SSiva Chandra Reddy       valueAsBits(__llvm_libc::modff(
40118c13c6SSiva Chandra Reddy           valueFromBits(BitPatterns::aNegativeSignallingNaN), &integral)));
41118c13c6SSiva Chandra Reddy 
42118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::zero,
43118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::inf),
44118c13c6SSiva Chandra Reddy                                            &integral)));
45118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), BitPatterns::inf);
46118c13c6SSiva Chandra Reddy 
47118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::negZero,
48118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::negInf),
49118c13c6SSiva Chandra Reddy                                            &integral)));
50118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), BitPatterns::negInf);
51118c13c6SSiva Chandra Reddy 
52118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::zero,
53118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::zero),
54118c13c6SSiva Chandra Reddy                                            &integral)));
55118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), BitPatterns::zero);
56118c13c6SSiva Chandra Reddy 
57118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::negZero,
58118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(valueFromBits(BitPatterns::negZero),
59118c13c6SSiva Chandra Reddy                                            &integral)));
60118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), BitPatterns::negZero);
61118c13c6SSiva Chandra Reddy }
62118c13c6SSiva Chandra Reddy 
63118c13c6SSiva Chandra Reddy TEST(ModffTest, Integers) {
64118c13c6SSiva Chandra Reddy   float integral;
65118c13c6SSiva Chandra Reddy 
66118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::zero,
67118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(1.0f, &integral)));
68118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(1.0f));
69118c13c6SSiva Chandra Reddy 
70118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::negZero,
71118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(-1.0f, &integral)));
72118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(-1.0f));
73118c13c6SSiva Chandra Reddy 
74118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::zero,
75118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(10.0f, &integral)));
76118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(10.0f));
77118c13c6SSiva Chandra Reddy 
78118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::negZero,
79118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(-10.0f, &integral)));
80118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(-10.0f));
81118c13c6SSiva Chandra Reddy 
82118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::zero,
83118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(12345.0f, &integral)));
84118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(12345.0f));
85118c13c6SSiva Chandra Reddy 
86118c13c6SSiva Chandra Reddy   EXPECT_EQ(BitPatterns::negZero,
87118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(-12345.0f, &integral)));
88118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(-12345.0f));
89118c13c6SSiva Chandra Reddy }
90118c13c6SSiva Chandra Reddy 
91*dc72be4eSSiva Chandra Reddy TEST(ModffTest, Fractions) {
92118c13c6SSiva Chandra Reddy   float integral;
93118c13c6SSiva Chandra Reddy 
94118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(0.5f),
95118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(1.5f, &integral)));
96118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(1.0f));
97118c13c6SSiva Chandra Reddy 
98118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(-0.5f),
99118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(-1.5f, &integral)));
100118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(-1.0f));
101118c13c6SSiva Chandra Reddy 
102118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(0.75f),
103118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(10.75f, &integral)));
104118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(10.0f));
105118c13c6SSiva Chandra Reddy 
106118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(-0.75f),
107118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(-10.75f, &integral)));
108118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(-10.0f));
109118c13c6SSiva Chandra Reddy 
110118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(0.125f),
111118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(100.125f, &integral)));
112118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(100.0f));
113118c13c6SSiva Chandra Reddy 
114118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(-0.125f),
115118c13c6SSiva Chandra Reddy             valueAsBits(__llvm_libc::modff(-100.125f, &integral)));
116118c13c6SSiva Chandra Reddy   EXPECT_EQ(valueAsBits(integral), valueAsBits(-100.0f));
117118c13c6SSiva Chandra Reddy }
118118c13c6SSiva Chandra Reddy 
119118c13c6SSiva Chandra Reddy TEST(ModffTest, InDoubleRange) {
120118c13c6SSiva Chandra Reddy   using BitsType = Properties::BitsType;
121118c13c6SSiva Chandra Reddy   constexpr BitsType count = 10000000;
122118c13c6SSiva Chandra Reddy   constexpr BitsType step = UINT32_MAX / count;
123118c13c6SSiva Chandra Reddy   for (BitsType i = 0, v = 0; i <= count; ++i, v += step) {
124118c13c6SSiva Chandra Reddy     float x = valueFromBits(v);
125118c13c6SSiva Chandra Reddy     if (isnan(x) || isinf(x) || x == 0.0f) {
126118c13c6SSiva Chandra Reddy       // These conditions have been tested in other tests.
127118c13c6SSiva Chandra Reddy       continue;
128118c13c6SSiva Chandra Reddy     }
129118c13c6SSiva Chandra Reddy 
130118c13c6SSiva Chandra Reddy     float integral;
131118c13c6SSiva Chandra Reddy     float frac = __llvm_libc::modff(x, &integral);
132118c13c6SSiva Chandra Reddy     ASSERT_TRUE(__llvm_libc::fputil::abs(frac) < 1.0f);
133118c13c6SSiva Chandra Reddy     ASSERT_TRUE(__llvm_libc::fputil::trunc(x) == integral);
134118c13c6SSiva Chandra Reddy     ASSERT_TRUE(integral + frac == x);
135118c13c6SSiva Chandra Reddy   }
136118c13c6SSiva Chandra Reddy }
137