comparison unittests/ADT/APFloatTest.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
comparison
equal deleted inserted replaced
146:3fc4d5c3e21e 148:63bd29f05246
1 //===- llvm/unittest/ADT/APFloat.cpp - APFloat unit tests ---------------------===// 1 //===- llvm/unittest/ADT/APFloat.cpp - APFloat unit tests ---------------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // 4 // See https://llvm.org/LICENSE.txt for license information.
5 // This file is distributed under the University of Illinois Open Source 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 // License. See LICENSE.TXT for details.
7 // 6 //
8 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
9 8
10 #include "llvm/ADT/APFloat.h" 9 #include "llvm/ADT/APFloat.h"
11 #include "llvm/ADT/APSInt.h" 10 #include "llvm/ADT/APSInt.h"
551 550
552 EXPECT_EQ(2.0, maxnum(f1, f2).convertToDouble()); 551 EXPECT_EQ(2.0, maxnum(f1, f2).convertToDouble());
553 EXPECT_EQ(2.0, maxnum(f2, f1).convertToDouble()); 552 EXPECT_EQ(2.0, maxnum(f2, f1).convertToDouble());
554 EXPECT_EQ(1.0, maxnum(f1, nan).convertToDouble()); 553 EXPECT_EQ(1.0, maxnum(f1, nan).convertToDouble());
555 EXPECT_EQ(1.0, maxnum(nan, f1).convertToDouble()); 554 EXPECT_EQ(1.0, maxnum(nan, f1).convertToDouble());
555 }
556
557 TEST(APFloatTest, Minimum) {
558 APFloat f1(1.0);
559 APFloat f2(2.0);
560 APFloat zp(0.0);
561 APFloat zn(-0.0);
562 APFloat nan = APFloat::getNaN(APFloat::IEEEdouble());
563
564 EXPECT_EQ(1.0, minimum(f1, f2).convertToDouble());
565 EXPECT_EQ(1.0, minimum(f2, f1).convertToDouble());
566 EXPECT_EQ(-0.0, minimum(zp, zn).convertToDouble());
567 EXPECT_EQ(-0.0, minimum(zn, zp).convertToDouble());
568 EXPECT_TRUE(std::isnan(minimum(f1, nan).convertToDouble()));
569 EXPECT_TRUE(std::isnan(minimum(nan, f1).convertToDouble()));
570 }
571
572 TEST(APFloatTest, Maximum) {
573 APFloat f1(1.0);
574 APFloat f2(2.0);
575 APFloat zp(0.0);
576 APFloat zn(-0.0);
577 APFloat nan = APFloat::getNaN(APFloat::IEEEdouble());
578
579 EXPECT_EQ(2.0, maximum(f1, f2).convertToDouble());
580 EXPECT_EQ(2.0, maximum(f2, f1).convertToDouble());
581 EXPECT_EQ(0.0, maximum(zp, zn).convertToDouble());
582 EXPECT_EQ(0.0, maximum(zn, zp).convertToDouble());
583 EXPECT_TRUE(std::isnan(maximum(f1, nan).convertToDouble()));
584 EXPECT_TRUE(std::isnan(maximum(nan, f1).convertToDouble()));
556 } 585 }
557 586
558 TEST(APFloatTest, Denormal) { 587 TEST(APFloatTest, Denormal) {
559 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven; 588 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
560 589
836 EXPECT_EQ(2.05e+2, APFloat(APFloat::IEEEdouble(), "002.05000e+2").convertToDouble()); 865 EXPECT_EQ(2.05e+2, APFloat(APFloat::IEEEdouble(), "002.05000e+2").convertToDouble());
837 EXPECT_EQ(2.05e-2, APFloat(APFloat::IEEEdouble(), "002.05000e-2").convertToDouble()); 866 EXPECT_EQ(2.05e-2, APFloat(APFloat::IEEEdouble(), "002.05000e-2").convertToDouble());
838 EXPECT_EQ(2.05e12, APFloat(APFloat::IEEEdouble(), "002.05000e12").convertToDouble()); 867 EXPECT_EQ(2.05e12, APFloat(APFloat::IEEEdouble(), "002.05000e12").convertToDouble());
839 EXPECT_EQ(2.05e+12, APFloat(APFloat::IEEEdouble(), "002.05000e+12").convertToDouble()); 868 EXPECT_EQ(2.05e+12, APFloat(APFloat::IEEEdouble(), "002.05000e+12").convertToDouble());
840 EXPECT_EQ(2.05e-12, APFloat(APFloat::IEEEdouble(), "002.05000e-12").convertToDouble()); 869 EXPECT_EQ(2.05e-12, APFloat(APFloat::IEEEdouble(), "002.05000e-12").convertToDouble());
870
871 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1e").convertToDouble());
872 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "+1e").convertToDouble());
873 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-1e").convertToDouble());
874
875 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.e").convertToDouble());
876 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "+1.e").convertToDouble());
877 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-1.e").convertToDouble());
878
879 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e").convertToDouble());
880 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), "+.1e").convertToDouble());
881 EXPECT_EQ(-0.1, APFloat(APFloat::IEEEdouble(), "-.1e").convertToDouble());
882
883 EXPECT_EQ(1.1, APFloat(APFloat::IEEEdouble(), "1.1e").convertToDouble());
884 EXPECT_EQ(1.1, APFloat(APFloat::IEEEdouble(), "+1.1e").convertToDouble());
885 EXPECT_EQ(-1.1, APFloat(APFloat::IEEEdouble(), "-1.1e").convertToDouble());
886
887 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1e+").convertToDouble());
888 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1e-").convertToDouble());
889
890 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e").convertToDouble());
891 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e+").convertToDouble());
892 EXPECT_EQ(0.1, APFloat(APFloat::IEEEdouble(), ".1e-").convertToDouble());
893
894 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0e").convertToDouble());
895 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0e+").convertToDouble());
896 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0e-").convertToDouble());
841 897
842 // These are "carefully selected" to overflow the fast log-base 898 // These are "carefully selected" to overflow the fast log-base
843 // calculations in APFloat.cpp 899 // calculations in APFloat.cpp
844 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "99e99999").isInfinity()); 900 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "99e99999").isInfinity());
845 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-99e99999").isInfinity()); 901 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-99e99999").isInfinity());
981 convertToString(4.9406564584124654e-324, 0, 3, false)); 1037 convertToString(4.9406564584124654e-324, 0, 3, false));
982 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1, false)); 1038 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1, false));
983 ASSERT_EQ("8.73183400000000010e+02", convertToString(873.1834, 0, 0, false)); 1039 ASSERT_EQ("8.73183400000000010e+02", convertToString(873.1834, 0, 0, false));
984 ASSERT_EQ("1.79769313486231570e+308", 1040 ASSERT_EQ("1.79769313486231570e+308",
985 convertToString(1.7976931348623157E+308, 0, 0, false)); 1041 convertToString(1.7976931348623157E+308, 0, 0, false));
1042
1043 {
1044 SmallString<64> Str;
1045 APFloat UnnormalZero(APFloat::x87DoubleExtended(), APInt(80, {0, 1}));
1046 UnnormalZero.toString(Str);
1047 ASSERT_EQ("NaN", Str);
1048 }
986 } 1049 }
987 1050
988 TEST(APFloatTest, toInteger) { 1051 TEST(APFloatTest, toInteger) {
989 bool isExact = false; 1052 bool isExact = false;
990 APSInt result(5, /*isUnsigned=*/true); 1053 APSInt result(5, /*isUnsigned=*/true);
1031 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1094 .convertToInteger(result, APFloat::rmTowardZero, &isExact));
1032 EXPECT_FALSE(isExact); 1095 EXPECT_FALSE(isExact);
1033 EXPECT_EQ(APSInt::getMaxValue(5, false), result); 1096 EXPECT_EQ(APSInt::getMaxValue(5, false), result);
1034 } 1097 }
1035 1098
1036 static APInt nanbits(const fltSemantics &Sem, 1099 static APInt nanbitsFromAPInt(const fltSemantics &Sem, bool SNaN, bool Negative,
1037 bool SNaN, bool Negative, uint64_t fill) { 1100 uint64_t payload) {
1038 APInt apfill(64, fill); 1101 APInt appayload(64, payload);
1039 if (SNaN) 1102 if (SNaN)
1040 return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt(); 1103 return APFloat::getSNaN(Sem, Negative, &appayload).bitcastToAPInt();
1041 else 1104 else
1042 return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt(); 1105 return APFloat::getQNaN(Sem, Negative, &appayload).bitcastToAPInt();
1043 } 1106 }
1044 1107
1045 TEST(APFloatTest, makeNaN) { 1108 TEST(APFloatTest, makeNaN) {
1046 ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle(), false, false, 0)); 1109 const struct {
1047 ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle(), false, true, 0)); 1110 uint64_t expected;
1048 ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle(), false, false, 0xae72)); 1111 const fltSemantics &semantics;
1049 ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle(), false, false, 0xffffae72)); 1112 bool SNaN;
1050 ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle(), true, false, 0)); 1113 bool Negative;
1051 ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle(), true, true, 0)); 1114 uint64_t payload;
1052 ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle(), true, false, 0xae72)); 1115 } tests[] = {
1053 ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle(), true, false, 0xffffae72)); 1116 /* expected semantics SNaN Neg payload */
1054 1117 { 0x7fc00000ULL, APFloat::IEEEsingle(), false, false, 0x00000000ULL },
1055 ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, false, 0)); 1118 { 0xffc00000ULL, APFloat::IEEEsingle(), false, true, 0x00000000ULL },
1056 ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, true, 0)); 1119 { 0x7fc0ae72ULL, APFloat::IEEEsingle(), false, false, 0x0000ae72ULL },
1057 ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xae72)); 1120 { 0x7fffae72ULL, APFloat::IEEEsingle(), false, false, 0xffffae72ULL },
1058 ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL)); 1121 { 0x7fdaae72ULL, APFloat::IEEEsingle(), false, false, 0x00daae72ULL },
1059 ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, false, 0)); 1122 { 0x7fa00000ULL, APFloat::IEEEsingle(), true, false, 0x00000000ULL },
1060 ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, true, 0)); 1123 { 0xffa00000ULL, APFloat::IEEEsingle(), true, true, 0x00000000ULL },
1061 ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xae72)); 1124 { 0x7f80ae72ULL, APFloat::IEEEsingle(), true, false, 0x0000ae72ULL },
1062 ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL)); 1125 { 0x7fbfae72ULL, APFloat::IEEEsingle(), true, false, 0xffffae72ULL },
1126 { 0x7f9aae72ULL, APFloat::IEEEsingle(), true, false, 0x001aae72ULL },
1127 { 0x7ff8000000000000ULL, APFloat::IEEEdouble(), false, false, 0x0000000000000000ULL },
1128 { 0xfff8000000000000ULL, APFloat::IEEEdouble(), false, true, 0x0000000000000000ULL },
1129 { 0x7ff800000000ae72ULL, APFloat::IEEEdouble(), false, false, 0x000000000000ae72ULL },
1130 { 0x7fffffffffffae72ULL, APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL },
1131 { 0x7ffdaaaaaaaaae72ULL, APFloat::IEEEdouble(), false, false, 0x000daaaaaaaaae72ULL },
1132 { 0x7ff4000000000000ULL, APFloat::IEEEdouble(), true, false, 0x0000000000000000ULL },
1133 { 0xfff4000000000000ULL, APFloat::IEEEdouble(), true, true, 0x0000000000000000ULL },
1134 { 0x7ff000000000ae72ULL, APFloat::IEEEdouble(), true, false, 0x000000000000ae72ULL },
1135 { 0x7ff7ffffffffae72ULL, APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL },
1136 { 0x7ff1aaaaaaaaae72ULL, APFloat::IEEEdouble(), true, false, 0x0001aaaaaaaaae72ULL },
1137 };
1138
1139 for (const auto &t : tests) {
1140 ASSERT_EQ(t.expected, nanbitsFromAPInt(t.semantics, t.SNaN, t.Negative, t.payload));
1141 }
1063 } 1142 }
1064 1143
1065 #ifdef GTEST_HAS_DEATH_TEST 1144 #ifdef GTEST_HAS_DEATH_TEST
1066 #ifndef NDEBUG 1145 #ifndef NDEBUG
1067 TEST(APFloatTest, SemanticsDeath) { 1146 TEST(APFloatTest, SemanticsDeath) {
1109 1188
1110 1189
1111 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".e"), "Significand has no digits"); 1190 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".e"), "Significand has no digits");
1112 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e"), "Significand has no digits"); 1191 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e"), "Significand has no digits");
1113 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e"), "Significand has no digits"); 1192 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e"), "Significand has no digits");
1114 }
1115
1116 TEST(APFloatTest, StringDecimalExponentDeath) {
1117 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e"), "Exponent has no digits");
1118 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1e"), "Exponent has no digits");
1119 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1e"), "Exponent has no digits");
1120
1121 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.e"), "Exponent has no digits");
1122 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1.e"), "Exponent has no digits");
1123 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1.e"), "Exponent has no digits");
1124
1125 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e"), "Exponent has no digits");
1126 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.1e"), "Exponent has no digits");
1127 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.1e"), "Exponent has no digits");
1128
1129 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.1e"), "Exponent has no digits");
1130 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1.1e"), "Exponent has no digits");
1131 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1.1e"), "Exponent has no digits");
1132
1133
1134 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e+"), "Exponent has no digits");
1135 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e-"), "Exponent has no digits");
1136
1137 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e"), "Exponent has no digits");
1138 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e+"), "Exponent has no digits");
1139 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e-"), "Exponent has no digits");
1140
1141 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e"), "Exponent has no digits");
1142 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e+"), "Exponent has no digits");
1143 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e-"), "Exponent has no digits");
1144 } 1193 }
1145 1194
1146 TEST(APFloatTest, StringHexadecimalDeath) { 1195 TEST(APFloatTest, StringHexadecimalDeath) {
1147 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x"), "Invalid string"); 1196 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x"), "Invalid string");
1148 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x"), "Invalid string"); 1197 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x"), "Invalid string");