xref: /llvm-project/flang/unittests/Runtime/Numeric.cpp (revision fc51c7f0cc1abf1679100d71d103fe5d943f580b)
1ffc67bb3SDavid Spickett //===-- flang/unittests/Runtime/Numeric.cpp ---------------------*- C++ -*-===//
2ffc67bb3SDavid Spickett //
3ffc67bb3SDavid Spickett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ffc67bb3SDavid Spickett // See https://llvm.org/LICENSE.txt for license information.
5ffc67bb3SDavid Spickett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ffc67bb3SDavid Spickett //
7ffc67bb3SDavid Spickett //===----------------------------------------------------------------------===//
8ffc67bb3SDavid Spickett 
9ffc67bb3SDavid Spickett #include "flang/Runtime/numeric.h"
10ffc67bb3SDavid Spickett #include "gtest/gtest.h"
11ffc67bb3SDavid Spickett #include "flang/Common/float128.h"
12ffc67bb3SDavid Spickett #include <cmath>
13ffc67bb3SDavid Spickett #include <limits>
14ffc67bb3SDavid Spickett 
15ffc67bb3SDavid Spickett using namespace Fortran::runtime;
16ffc67bb3SDavid Spickett using Fortran::common::TypeCategory;
17ffc67bb3SDavid Spickett template <int KIND> using Int = CppTypeFor<TypeCategory::Integer, KIND>;
18ffc67bb3SDavid Spickett template <int KIND> using Real = CppTypeFor<TypeCategory::Real, KIND>;
19ffc67bb3SDavid Spickett 
20ffc67bb3SDavid Spickett // Simple tests of numeric intrinsic functions using examples from Fortran 2018
21ffc67bb3SDavid Spickett 
22ffc67bb3SDavid Spickett TEST(Numeric, Ceiling) {
23ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Ceiling4_4)(Real<4>{3.7}), 4);
24ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Ceiling8_8)(Real<8>{-3.7}), -3);
25ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Ceiling4_1)(Real<4>{0}), 0);
26ffc67bb3SDavid Spickett }
27ffc67bb3SDavid Spickett 
28ffc67bb3SDavid Spickett TEST(Numeric, Floor) {
29ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Floor4_4)(Real<4>{3.7}), 3);
30ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Floor8_8)(Real<8>{-3.7}), -4);
31ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Floor4_1)(Real<4>{0}), 0);
32ffc67bb3SDavid Spickett }
33ffc67bb3SDavid Spickett 
34a03e93e1SDavid Parks TEST(Numeric, Erfc_scaled) {
35a03e93e1SDavid Parks   EXPECT_NEAR(RTNAME(ErfcScaled4)(Real<4>{20.0}), 0.02817434874, 1.0e-8);
36a03e93e1SDavid Parks   EXPECT_NEAR(RTNAME(ErfcScaled8)(Real<8>{20.0}), 0.02817434874, 1.0e-11);
37104f3c18SSlava Zakharin #if HAS_FLOAT80
38a03e93e1SDavid Parks   EXPECT_NEAR(RTNAME(ErfcScaled10)(Real<10>{20.0}), 0.02817434874, 1.0e-8);
39a03e93e1SDavid Parks #endif
40a03e93e1SDavid Parks }
41a03e93e1SDavid Parks 
42ffc67bb3SDavid Spickett TEST(Numeric, Exponent) {
43ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Exponent4_4)(Real<4>{0}), 0);
44ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Exponent4_8)(Real<4>{1.0}), 1);
45ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Exponent8_4)(Real<8>{4.1}), 3);
46ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Exponent8_8)(std::numeric_limits<Real<8>>::infinity()),
47ffc67bb3SDavid Spickett       std::numeric_limits<Int<8>>::max());
48ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Exponent8_8)(std::numeric_limits<Real<8>>::quiet_NaN()),
49ffc67bb3SDavid Spickett       std::numeric_limits<Int<8>>::max());
50ffc67bb3SDavid Spickett }
51ffc67bb3SDavid Spickett 
52ffc67bb3SDavid Spickett TEST(Numeric, Fraction) {
53ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Fraction4)(Real<4>{0}), 0);
54ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Fraction8)(Real<8>{3.0}), 0.75);
55ffc67bb3SDavid Spickett   EXPECT_TRUE(
56ffc67bb3SDavid Spickett       std::isnan(RTNAME(Fraction4)(std::numeric_limits<Real<4>>::infinity())));
57ffc67bb3SDavid Spickett   EXPECT_TRUE(
58ffc67bb3SDavid Spickett       std::isnan(RTNAME(Fraction8)(std::numeric_limits<Real<8>>::quiet_NaN())));
59ffc67bb3SDavid Spickett }
60ffc67bb3SDavid Spickett 
61ffc67bb3SDavid Spickett TEST(Numeric, IsNaN) {
62ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(IsNaN4)(Real<4>{0}));
63ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(IsNaN8)(std::numeric_limits<Real<8>>::infinity()));
64ffc67bb3SDavid Spickett   EXPECT_TRUE(RTNAME(IsNaN8)(std::numeric_limits<Real<8>>::quiet_NaN()));
65ffc67bb3SDavid Spickett }
66ffc67bb3SDavid Spickett 
67ffc67bb3SDavid Spickett TEST(Numeric, Mod) {
68ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModInteger1)(Int<1>{8}, Int<1>(5)), 3);
69ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModInteger4)(Int<4>{-8}, Int<4>(5)), -3);
70ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModInteger2)(Int<2>{8}, Int<2>(-5)), 3);
71ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModInteger8)(Int<8>{-8}, Int<8>(-5)), -3);
72ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModReal4)(Real<4>{8.0}, Real<4>(5.0)), 3.0);
73ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModReal4)(Real<4>{-8.0}, Real<4>(5.0)), -3.0);
74ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModReal8)(Real<8>{8.0}, Real<8>(-5.0)), 3.0);
75ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModReal8)(Real<8>{-8.0}, Real<8>(-5.0)), -3.0);
76315c88c5SSlava Zakharin   EXPECT_EQ(
77315c88c5SSlava Zakharin       RTNAME(ModReal4)(Real<4>{0.5}, std::numeric_limits<Real<4>>::infinity()),
78315c88c5SSlava Zakharin       0.5);
79315c88c5SSlava Zakharin   EXPECT_EQ(
80315c88c5SSlava Zakharin       RTNAME(ModReal4)(Real<4>{-0.5}, std::numeric_limits<Real<4>>::infinity()),
81315c88c5SSlava Zakharin       -0.5);
82315c88c5SSlava Zakharin   EXPECT_EQ(
83315c88c5SSlava Zakharin       RTNAME(ModReal4)(Real<4>{0.5}, -std::numeric_limits<Real<4>>::infinity()),
84315c88c5SSlava Zakharin       0.5);
85315c88c5SSlava Zakharin   EXPECT_EQ(RTNAME(ModReal4)(
86315c88c5SSlava Zakharin                 Real<4>{-0.5}, -std::numeric_limits<Real<4>>::infinity()),
87315c88c5SSlava Zakharin       -0.5);
88315c88c5SSlava Zakharin   EXPECT_EQ(
89315c88c5SSlava Zakharin       RTNAME(ModReal8)(Real<8>{0.5}, std::numeric_limits<Real<8>>::infinity()),
90315c88c5SSlava Zakharin       0.5);
91315c88c5SSlava Zakharin   EXPECT_EQ(
92315c88c5SSlava Zakharin       RTNAME(ModReal8)(Real<8>{-0.5}, std::numeric_limits<Real<8>>::infinity()),
93315c88c5SSlava Zakharin       -0.5);
94315c88c5SSlava Zakharin   EXPECT_EQ(
95315c88c5SSlava Zakharin       RTNAME(ModReal8)(Real<8>{0.5}, -std::numeric_limits<Real<8>>::infinity()),
96315c88c5SSlava Zakharin       0.5);
97315c88c5SSlava Zakharin   EXPECT_EQ(RTNAME(ModReal8)(
98315c88c5SSlava Zakharin                 Real<8>{-0.5}, -std::numeric_limits<Real<8>>::infinity()),
99315c88c5SSlava Zakharin       -0.5);
100ffc67bb3SDavid Spickett }
101ffc67bb3SDavid Spickett 
102ffc67bb3SDavid Spickett TEST(Numeric, Modulo) {
103ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloInteger1)(Int<1>{8}, Int<1>(5)), 3);
104ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloInteger4)(Int<4>{-8}, Int<4>(5)), 2);
105ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloInteger2)(Int<2>{8}, Int<2>(-5)), -2);
106ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloInteger8)(Int<8>{-8}, Int<8>(-5)), -3);
107ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloReal4)(Real<4>{8.0}, Real<4>(5.0)), 3.0);
108ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloReal4)(Real<4>{-8.0}, Real<4>(5.0)), 2.0);
109ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloReal8)(Real<8>{8.0}, Real<8>(-5.0)), -2.0);
110ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(ModuloReal8)(Real<8>{-8.0}, Real<8>(-5.0)), -3.0);
111315c88c5SSlava Zakharin   // MODULO(x, INF) == NaN
112315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal4)(
113315c88c5SSlava Zakharin       Real<4>{0.5}, std::numeric_limits<Real<4>>::infinity())));
114315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal4)(
115315c88c5SSlava Zakharin       Real<4>{-0.5}, std::numeric_limits<Real<4>>::infinity())));
116315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal4)(
117315c88c5SSlava Zakharin       Real<4>{0.5}, -std::numeric_limits<Real<4>>::infinity())));
118315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal4)(
119315c88c5SSlava Zakharin       Real<4>{-0.5}, -std::numeric_limits<Real<4>>::infinity())));
120315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal8)(
121315c88c5SSlava Zakharin       Real<8>{-0.5}, std::numeric_limits<Real<8>>::infinity())));
122315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal8)(
123315c88c5SSlava Zakharin       Real<8>{0.5}, std::numeric_limits<Real<8>>::infinity())));
124315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal8)(
125315c88c5SSlava Zakharin       Real<8>{-0.5}, -std::numeric_limits<Real<8>>::infinity())));
126315c88c5SSlava Zakharin   EXPECT_TRUE(std::isnan(RTNAME(ModuloReal8)(
127315c88c5SSlava Zakharin       Real<8>{0.5}, -std::numeric_limits<Real<8>>::infinity())));
128315c88c5SSlava Zakharin   // MODULO(x, y) for integer values of x and y with 0 remainder.
129315c88c5SSlava Zakharin   EXPECT_EQ(RTNAME(ModuloReal4)(Real<4>{5.0}, Real<4>(1.0)), 0.0);
130315c88c5SSlava Zakharin   EXPECT_EQ(RTNAME(ModuloReal4)(Real<4>{5.0}, Real<4>(-1.0)), -0.0);
131315c88c5SSlava Zakharin   EXPECT_EQ(RTNAME(ModuloReal4)(Real<4>{-5.0}, Real<4>(1.0)), 0.0);
132315c88c5SSlava Zakharin   EXPECT_EQ(RTNAME(ModuloReal4)(Real<4>{-5.0}, Real<4>(-1.0)), -0.0);
133ffc67bb3SDavid Spickett }
134ffc67bb3SDavid Spickett 
135ffc67bb3SDavid Spickett TEST(Numeric, Nearest) {
136ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nearest4)(Real<4>{0}, true),
137ffc67bb3SDavid Spickett       std::numeric_limits<Real<4>>::denorm_min());
138ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nearest4)(Real<4>{3.0}, true),
139ffc67bb3SDavid Spickett       Real<4>{3.0} + std::ldexp(Real<4>{1.0}, -22));
140ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nearest8)(Real<8>{1.0}, true),
141ffc67bb3SDavid Spickett       Real<8>{1.0} + std::ldexp(Real<8>{1.0}, -52));
142ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nearest8)(Real<8>{1.0}, false),
14339c2f597SPeter Klausler       Real<8>{1.0} - 0.5 * std::ldexp(Real<8>{1.0}, -52));
144ffc67bb3SDavid Spickett }
145ffc67bb3SDavid Spickett 
146ffc67bb3SDavid Spickett TEST(Numeric, Nint) {
147ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nint4_4)(Real<4>{2.783}), 3);
148ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nint8_4)(Real<8>{-2.783}), -3);
149ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nint4_4)(Real<4>{2.5}), 3);
150ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nint8_4)(Real<8>{-2.5}), -3);
151ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Nint8_8)(Real<8>{0}), 0);
152ffc67bb3SDavid Spickett }
153ffc67bb3SDavid Spickett 
154ffc67bb3SDavid Spickett TEST(Numeric, RRSpacing) {
155ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(RRSpacing8)(Real<8>{0}), 0);
156ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(RRSpacing4)(Real<4>{-3.0}), 0.75 * (1 << 24));
157ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(RRSpacing8)(Real<8>{-3.0}), 0.75 * (std::int64_t{1} << 53));
158ffc67bb3SDavid Spickett   EXPECT_TRUE(
159ffc67bb3SDavid Spickett       std::isnan(RTNAME(RRSpacing4)(std::numeric_limits<Real<4>>::infinity())));
160ffc67bb3SDavid Spickett   EXPECT_TRUE(std::isnan(
161ffc67bb3SDavid Spickett       RTNAME(RRSpacing8)(std::numeric_limits<Real<8>>::quiet_NaN())));
162ffc67bb3SDavid Spickett }
163ffc67bb3SDavid Spickett 
164ffc67bb3SDavid Spickett TEST(Numeric, Scale) {
165ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Scale4)(Real<4>{0}, 0), 0);
166ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Scale4)(Real<4>{1.0}, 0), 1.0);
167ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Scale4)(Real<4>{1.0}, 1), 2.0);
168ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Scale4)(Real<4>{1.0}, -1), 0.5);
169ffc67bb3SDavid Spickett   EXPECT_TRUE(
170ffc67bb3SDavid Spickett       std::isinf(RTNAME(Scale4)(std::numeric_limits<Real<4>>::infinity(), 1)));
171ffc67bb3SDavid Spickett   EXPECT_TRUE(
172ffc67bb3SDavid Spickett       std::isnan(RTNAME(Scale8)(std::numeric_limits<Real<8>>::quiet_NaN(), 1)));
173ffc67bb3SDavid Spickett }
174ffc67bb3SDavid Spickett 
175ffc67bb3SDavid Spickett TEST(Numeric, SetExponent) {
176ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{0}, 0), 0);
177ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SetExponent8)(Real<8>{0}, 666), 0);
178ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SetExponent8)(Real<8>{3.0}, 0), 0.75);
179ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, 0), 0.5);
180ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, 1), 1.0);
181ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SetExponent4)(Real<4>{1.0}, -1), 0.25);
182ffc67bb3SDavid Spickett   EXPECT_TRUE(std::isnan(
183ffc67bb3SDavid Spickett       RTNAME(SetExponent4)(std::numeric_limits<Real<4>>::infinity(), 1)));
184ffc67bb3SDavid Spickett   EXPECT_TRUE(std::isnan(
185ffc67bb3SDavid Spickett       RTNAME(SetExponent8)(std::numeric_limits<Real<8>>::quiet_NaN(), 1)));
186ffc67bb3SDavid Spickett }
187ffc67bb3SDavid Spickett 
188ffc67bb3SDavid Spickett TEST(Numeric, SelectedIntKind) {
189ffc67bb3SDavid Spickett   std::int8_t r0 = 1;
190ffc67bb3SDavid Spickett   std::int16_t r1 = 3;
191ffc67bb3SDavid Spickett   std::int32_t r2 = 8;
192ffc67bb3SDavid Spickett   std::int64_t r3 = 10;
193ffc67bb3SDavid Spickett   std::int32_t r4 = -10;
194ffc67bb3SDavid Spickett   std::int32_t r5 = 100;
195ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedIntKind)(__FILE__, __LINE__, &r0, 1), 1);
196ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedIntKind)(__FILE__, __LINE__, &r1, 2), 2);
197ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedIntKind)(__FILE__, __LINE__, &r2, 4), 4);
198ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedIntKind)(__FILE__, __LINE__, &r3, 8), 8);
199ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedIntKind)(__FILE__, __LINE__, &r4, 4), 1);
200ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedIntKind)(__FILE__, __LINE__, &r5, 4), -1);
201ffc67bb3SDavid Spickett }
202ffc67bb3SDavid Spickett 
203ffc67bb3SDavid Spickett TEST(Numeric, SelectedRealKind) {
204ffc67bb3SDavid Spickett   std::int8_t p_s = 1;
205ffc67bb3SDavid Spickett   std::int16_t p[11] = {-10, 1, 1, 4, 50, 1, 1, 4, 1, 1, 50};
206ffc67bb3SDavid Spickett   std::int32_t r[11] = {-1, 1, 1, 1, 2, 1, 20, 20, 100, 5000, 5000};
207ffc67bb3SDavid Spickett   std::int64_t d[11] = {2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2};
208ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
209ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[0], 2, &r[0], 4, &d[0], 8),
210ffc67bb3SDavid Spickett       2);
211ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
212ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[1], 2, &r[1], 4, &d[1], 8),
213ffc67bb3SDavid Spickett       -5);
214ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
215ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[2], 2, &r[2], 4, &d[2], 8),
216ffc67bb3SDavid Spickett       2);
217ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
218ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[3], 2, &r[3], 4, &d[3], 8),
219ffc67bb3SDavid Spickett       4);
220ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
221ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[4], 2, &r[4], 4, &d[4], 8),
222ffc67bb3SDavid Spickett       -1);
223ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
224ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[5], 2, &r[5], 4, &d[5], 8),
225ffc67bb3SDavid Spickett       2);
226ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
227ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[6], 2, &r[6], 4, &d[6], 8),
228ffc67bb3SDavid Spickett       3);
229ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
230ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[7], 2, &r[7], 4, &d[7], 8),
231ffc67bb3SDavid Spickett       4);
232ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
233ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[8], 2, &r[8], 4, &d[8], 8),
234ffc67bb3SDavid Spickett       8);
235ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
236ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[9], 2, &r[9], 4, &d[9], 8),
237ffc67bb3SDavid Spickett       -2);
238ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
239ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[10], 2, &r[10], 4, &d[10], 8),
240ffc67bb3SDavid Spickett       -3);
241ffc67bb3SDavid Spickett   EXPECT_EQ(
242ffc67bb3SDavid Spickett       RTNAME(SelectedRealKind)(__FILE__, __LINE__, &p_s, 1, &r[0], 4, &d[0], 8),
243ffc67bb3SDavid Spickett       2);
244ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
245ffc67bb3SDavid Spickett                 __FILE__, __LINE__, nullptr, 0, &r[0], 4, &d[0], 8),
246ffc67bb3SDavid Spickett       2);
247ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
248ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[0], 2, nullptr, 0, &d[0], 8),
249ffc67bb3SDavid Spickett       2);
250ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(SelectedRealKind)(
251ffc67bb3SDavid Spickett                 __FILE__, __LINE__, &p[0], 2, &r[0], 4, nullptr, 0),
252ffc67bb3SDavid Spickett       2);
253ffc67bb3SDavid Spickett }
254ffc67bb3SDavid Spickett 
255ffc67bb3SDavid Spickett TEST(Numeric, Spacing) {
256ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Spacing8)(Real<8>{0}), std::numeric_limits<Real<8>>::min());
257ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(Spacing4)(Real<4>{3.0}), std::ldexp(Real<4>{1.0}, -22));
258ffc67bb3SDavid Spickett   EXPECT_TRUE(
259ffc67bb3SDavid Spickett       std::isnan(RTNAME(Spacing4)(std::numeric_limits<Real<4>>::infinity())));
260ffc67bb3SDavid Spickett   EXPECT_TRUE(
261ffc67bb3SDavid Spickett       std::isnan(RTNAME(Spacing8)(std::numeric_limits<Real<8>>::quiet_NaN())));
262500f6cc2SPeter Klausler   EXPECT_EQ(RTNAME(Spacing2By4)(Real<4>{3.0}), std::ldexp(Real<4>{1.0}, -9));
263500f6cc2SPeter Klausler   EXPECT_EQ(RTNAME(Spacing2By4)(Real<4>{0.0}), Real<4>{0.00006103515625E-04});
264500f6cc2SPeter Klausler   EXPECT_EQ(RTNAME(Spacing3By4)(Real<4>{3.0}), std::ldexp(Real<4>{1.0}, -6));
265500f6cc2SPeter Klausler   EXPECT_EQ(
266500f6cc2SPeter Klausler       RTNAME(Spacing3By4)(Real<4>{0.0}), std::numeric_limits<Real<4>>::min());
267ffc67bb3SDavid Spickett }
268ffc67bb3SDavid Spickett 
269ffc67bb3SDavid Spickett TEST(Numeric, FPowI) {
270ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4i)(Real<4>{0}, Int<4>{0}), Real<4>{1});
271ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4i)(Real<4>{0.3}, Int<4>{0}), Real<4>{1});
272ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4i)(Real<4>{2}, Int<4>{-1}), Real<4>{0.5});
273ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4i)(Real<4>{0.5}, Int<4>{-1}), Real<4>{2});
274ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4i)(Real<4>{-3}, Int<4>{3}), Real<4>{-27});
275ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4i)(Real<4>{-2}, Int<4>{-3}), Real<4>{-0.125});
276ffc67bb3SDavid Spickett 
277ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4k)(Real<4>{0}, Int<8>{0}), Real<4>{1});
278ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4k)(Real<4>{0.3}, Int<8>{0}), Real<4>{1});
279ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4k)(Real<4>{2}, Int<8>{-1}), Real<4>{0.5});
280ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4k)(Real<4>{0.5}, Int<8>{-1}), Real<4>{2});
281ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4k)(Real<4>{-3}, Int<8>{3}), Real<4>{-27});
282ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow4k)(Real<4>{-2}, Int<8>{-3}), Real<4>{-0.125});
283ffc67bb3SDavid Spickett 
284ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8i)(Real<8>{0}, Int<4>{0}), Real<8>{1});
285ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8i)(Real<8>{0.3}, Int<4>{0}), Real<8>{1});
286ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8i)(Real<8>{2}, Int<4>{-1}), Real<8>{0.5});
287ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8i)(Real<8>{0.5}, Int<4>{-1}), Real<8>{2});
288ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8i)(Real<8>{-3}, Int<4>{3}), Real<8>{-27});
289ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8i)(Real<8>{-2}, Int<4>{-3}), Real<8>{-0.125});
290ffc67bb3SDavid Spickett 
291ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8k)(Real<8>{0}, Int<8>{0}), Real<8>{1});
292ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8k)(Real<8>{0.3}, Int<8>{0}), Real<8>{1});
293ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8k)(Real<8>{2}, Int<8>{-1}), Real<8>{0.5});
294ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8k)(Real<8>{0.5}, Int<8>{-1}), Real<8>{2});
295ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8k)(Real<8>{-3}, Int<8>{3}), Real<8>{-27});
296ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow8k)(Real<8>{-2}, Int<8>{-3}), Real<8>{-0.125});
297ffc67bb3SDavid Spickett 
298104f3c18SSlava Zakharin #if HAS_FLOAT80
299ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10i)(Real<10>{0}, Int<4>{0}), Real<10>{1});
300ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10i)(Real<10>{0.3}, Int<4>{0}), Real<10>{1});
301ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10i)(Real<10>{2}, Int<4>{-1}), Real<10>{0.5});
302ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10i)(Real<10>{0.5}, Int<4>{-1}), Real<10>{2});
303ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10i)(Real<10>{-3}, Int<4>{3}), Real<10>{-27});
304ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10i)(Real<10>{-2}, Int<4>{-3}), Real<10>{-0.125});
305ffc67bb3SDavid Spickett 
306ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10k)(Real<10>{0}, Int<8>{0}), Real<10>{1});
307ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10k)(Real<10>{0.3}, Int<8>{0}), Real<10>{1});
308ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10k)(Real<10>{2}, Int<8>{-1}), Real<10>{0.5});
309ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10k)(Real<10>{0.5}, Int<8>{-1}), Real<10>{2});
310ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10k)(Real<10>{-3}, Int<8>{3}), Real<10>{-27});
311ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow10k)(Real<10>{-2}, Int<8>{-3}), Real<10>{-0.125});
312ffc67bb3SDavid Spickett #endif
313*fc51c7f0SSlava Zakharin #if HAS_LDBL128 || HAS_FLOAT128
314ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16i)(Real<16>{0}, Int<4>{0}), Real<16>{1});
315ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16i)(Real<16>{0.3}, Int<4>{0}), Real<16>{1});
316ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16i)(Real<16>{2}, Int<4>{-1}), Real<16>{0.5});
317ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16i)(Real<16>{0.5}, Int<4>{-1}), Real<16>{2});
318ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16i)(Real<16>{-3}, Int<4>{3}), Real<16>{-27});
319ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16i)(Real<16>{-2}, Int<4>{-3}), Real<16>{-0.125});
320ffc67bb3SDavid Spickett 
321ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16k)(Real<16>{0}, Int<8>{0}), Real<16>{1});
322ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16k)(Real<16>{0.3}, Int<8>{0}), Real<16>{1});
323ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16k)(Real<16>{2}, Int<8>{-1}), Real<16>{0.5});
324ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16k)(Real<16>{0.5}, Int<8>{-1}), Real<16>{2});
325ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16k)(Real<16>{-3}, Int<8>{3}), Real<16>{-27});
326ffc67bb3SDavid Spickett   EXPECT_EQ(RTNAME(FPow16k)(Real<16>{-2}, Int<8>{-3}), Real<16>{-0.125});
327ffc67bb3SDavid Spickett #endif
328ffc67bb3SDavid Spickett 
329ffc67bb3SDavid Spickett   // Test some extreme values.
330ffc67bb3SDavid Spickett   if (sizeof(double) == sizeof(std::uint64_t)) {
331ffc67bb3SDavid Spickett     // (0x3FF0000000000001 ** -2147483648) ~ 0x3FEFFFFF00000401
332ffc67bb3SDavid Spickett     double base;
333ffc67bb3SDavid Spickett     *reinterpret_cast<std::uint64_t *>(&base) = 4607182418800017409ULL;
334ffc67bb3SDavid Spickett     double result;
335ffc67bb3SDavid Spickett     *reinterpret_cast<std::uint64_t *>(&result) = 4607182414505051137ULL;
336ffc67bb3SDavid Spickett     EXPECT_TRUE(std::abs(RTNAME(FPow8i)(Real<8>{base},
337ffc67bb3SDavid Spickett                              Int<4>{std::numeric_limits<Int<4>>::min()}) -
338ffc67bb3SDavid Spickett                     Real<8>{result}) < 0.00000000001);
339ffc67bb3SDavid Spickett 
340ffc67bb3SDavid Spickett     // (0x3FF0000000000001 ** 4294967296ULL) ~ 0x3FF00001000007FF
341ffc67bb3SDavid Spickett     *reinterpret_cast<std::uint64_t *>(&base) = 4607182418800017409ULL;
342ffc67bb3SDavid Spickett     *reinterpret_cast<std::uint64_t *>(&result) = 4607182423094986751ULL;
343ffc67bb3SDavid Spickett     EXPECT_TRUE(std::abs(RTNAME(FPow8k)(Real<8>{base}, Int<8>{4294967296ULL}) -
344ffc67bb3SDavid Spickett                     Real<8>{result}) < 0.00000000001);
345ffc67bb3SDavid Spickett   }
346ffc67bb3SDavid Spickett }
347