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