Mercurial > hg > CbC > CbC_llvm
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"); |