1 //===- llvm/unittest/ADT/APFloat.cpp - APFloat unit tests ---------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "llvm/ADT/APFloat.h" 11 #include "llvm/ADT/APSInt.h" 12 #include "llvm/ADT/Hashing.h" 13 #include "llvm/ADT/SmallVector.h" 14 #include "llvm/Support/FormatVariadic.h" 15 #include "llvm/Support/raw_ostream.h" 16 #include "gtest/gtest.h" 17 #include <cmath> 18 #include <ostream> 19 #include <string> 20 #include <tuple> 21 22 using namespace llvm; 23 24 static double convertToDoubleFromString(const char *Str) { 25 llvm::APFloat F(0.0); 26 F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven); 27 return F.convertToDouble(); 28 } 29 30 static std::string convertToString(double d, unsigned Prec, unsigned Pad, 31 bool Tr = true) { 32 llvm::SmallVector<char, 100> Buffer; 33 llvm::APFloat F(d); 34 F.toString(Buffer, Prec, Pad, Tr); 35 return std::string(Buffer.data(), Buffer.size()); 36 } 37 38 namespace { 39 40 TEST(APFloatTest, isSignaling) { 41 // We test qNaN, -qNaN, +sNaN, -sNaN with and without payloads. *NOTE* The 42 // positive/negative distinction is included only since the getQNaN/getSNaN 43 // API provides the option. 44 APInt payload = APInt::getOneBitSet(4, 2); 45 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), false).isSignaling()); 46 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), true).isSignaling()); 47 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), false, &payload).isSignaling()); 48 EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), true, &payload).isSignaling()); 49 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isSignaling()); 50 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isSignaling()); 51 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false, &payload).isSignaling()); 52 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true, &payload).isSignaling()); 53 } 54 55 TEST(APFloatTest, next) { 56 57 APFloat test(APFloat::IEEEquad(), APFloat::uninitialized); 58 APFloat expected(APFloat::IEEEquad(), APFloat::uninitialized); 59 60 // 1. Test Special Cases Values. 61 // 62 // Test all special values for nextUp and nextDown perscribed by IEEE-754R 63 // 2008. These are: 64 // 1. +inf 65 // 2. -inf 66 // 3. getLargest() 67 // 4. -getLargest() 68 // 5. getSmallest() 69 // 6. -getSmallest() 70 // 7. qNaN 71 // 8. sNaN 72 // 9. +0 73 // 10. -0 74 75 // nextUp(+inf) = +inf. 76 test = APFloat::getInf(APFloat::IEEEquad(), false); 77 expected = APFloat::getInf(APFloat::IEEEquad(), false); 78 EXPECT_EQ(test.next(false), APFloat::opOK); 79 EXPECT_TRUE(test.isInfinity()); 80 EXPECT_TRUE(!test.isNegative()); 81 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 82 83 // nextDown(+inf) = -nextUp(-inf) = -(-getLargest()) = getLargest() 84 test = APFloat::getInf(APFloat::IEEEquad(), false); 85 expected = APFloat::getLargest(APFloat::IEEEquad(), false); 86 EXPECT_EQ(test.next(true), APFloat::opOK); 87 EXPECT_TRUE(!test.isNegative()); 88 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 89 90 // nextUp(-inf) = -getLargest() 91 test = APFloat::getInf(APFloat::IEEEquad(), true); 92 expected = APFloat::getLargest(APFloat::IEEEquad(), true); 93 EXPECT_EQ(test.next(false), APFloat::opOK); 94 EXPECT_TRUE(test.isNegative()); 95 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 96 97 // nextDown(-inf) = -nextUp(+inf) = -(+inf) = -inf. 98 test = APFloat::getInf(APFloat::IEEEquad(), true); 99 expected = APFloat::getInf(APFloat::IEEEquad(), true); 100 EXPECT_EQ(test.next(true), APFloat::opOK); 101 EXPECT_TRUE(test.isInfinity() && test.isNegative()); 102 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 103 104 // nextUp(getLargest()) = +inf 105 test = APFloat::getLargest(APFloat::IEEEquad(), false); 106 expected = APFloat::getInf(APFloat::IEEEquad(), false); 107 EXPECT_EQ(test.next(false), APFloat::opOK); 108 EXPECT_TRUE(test.isInfinity() && !test.isNegative()); 109 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 110 111 // nextDown(getLargest()) = -nextUp(-getLargest()) 112 // = -(-getLargest() + inc) 113 // = getLargest() - inc. 114 test = APFloat::getLargest(APFloat::IEEEquad(), false); 115 expected = APFloat(APFloat::IEEEquad(), 116 "0x1.fffffffffffffffffffffffffffep+16383"); 117 EXPECT_EQ(test.next(true), APFloat::opOK); 118 EXPECT_TRUE(!test.isInfinity() && !test.isNegative()); 119 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 120 121 // nextUp(-getLargest()) = -getLargest() + inc. 122 test = APFloat::getLargest(APFloat::IEEEquad(), true); 123 expected = APFloat(APFloat::IEEEquad(), 124 "-0x1.fffffffffffffffffffffffffffep+16383"); 125 EXPECT_EQ(test.next(false), APFloat::opOK); 126 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 127 128 // nextDown(-getLargest()) = -nextUp(getLargest()) = -(inf) = -inf. 129 test = APFloat::getLargest(APFloat::IEEEquad(), true); 130 expected = APFloat::getInf(APFloat::IEEEquad(), true); 131 EXPECT_EQ(test.next(true), APFloat::opOK); 132 EXPECT_TRUE(test.isInfinity() && test.isNegative()); 133 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 134 135 // nextUp(getSmallest()) = getSmallest() + inc. 136 test = APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382"); 137 expected = APFloat(APFloat::IEEEquad(), 138 "0x0.0000000000000000000000000002p-16382"); 139 EXPECT_EQ(test.next(false), APFloat::opOK); 140 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 141 142 // nextDown(getSmallest()) = -nextUp(-getSmallest()) = -(-0) = +0. 143 test = APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382"); 144 expected = APFloat::getZero(APFloat::IEEEquad(), false); 145 EXPECT_EQ(test.next(true), APFloat::opOK); 146 EXPECT_TRUE(test.isPosZero()); 147 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 148 149 // nextUp(-getSmallest()) = -0. 150 test = APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382"); 151 expected = APFloat::getZero(APFloat::IEEEquad(), true); 152 EXPECT_EQ(test.next(false), APFloat::opOK); 153 EXPECT_TRUE(test.isNegZero()); 154 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 155 156 // nextDown(-getSmallest()) = -nextUp(getSmallest()) = -getSmallest() - inc. 157 test = APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382"); 158 expected = APFloat(APFloat::IEEEquad(), 159 "-0x0.0000000000000000000000000002p-16382"); 160 EXPECT_EQ(test.next(true), APFloat::opOK); 161 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 162 163 // nextUp(qNaN) = qNaN 164 test = APFloat::getQNaN(APFloat::IEEEquad(), false); 165 expected = APFloat::getQNaN(APFloat::IEEEquad(), false); 166 EXPECT_EQ(test.next(false), APFloat::opOK); 167 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 168 169 // nextDown(qNaN) = qNaN 170 test = APFloat::getQNaN(APFloat::IEEEquad(), false); 171 expected = APFloat::getQNaN(APFloat::IEEEquad(), false); 172 EXPECT_EQ(test.next(true), APFloat::opOK); 173 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 174 175 // nextUp(sNaN) = qNaN 176 test = APFloat::getSNaN(APFloat::IEEEquad(), false); 177 expected = APFloat::getQNaN(APFloat::IEEEquad(), false); 178 EXPECT_EQ(test.next(false), APFloat::opInvalidOp); 179 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 180 181 // nextDown(sNaN) = qNaN 182 test = APFloat::getSNaN(APFloat::IEEEquad(), false); 183 expected = APFloat::getQNaN(APFloat::IEEEquad(), false); 184 EXPECT_EQ(test.next(true), APFloat::opInvalidOp); 185 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 186 187 // nextUp(+0) = +getSmallest() 188 test = APFloat::getZero(APFloat::IEEEquad(), false); 189 expected = APFloat::getSmallest(APFloat::IEEEquad(), false); 190 EXPECT_EQ(test.next(false), APFloat::opOK); 191 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 192 193 // nextDown(+0) = -nextUp(-0) = -getSmallest() 194 test = APFloat::getZero(APFloat::IEEEquad(), false); 195 expected = APFloat::getSmallest(APFloat::IEEEquad(), true); 196 EXPECT_EQ(test.next(true), APFloat::opOK); 197 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 198 199 // nextUp(-0) = +getSmallest() 200 test = APFloat::getZero(APFloat::IEEEquad(), true); 201 expected = APFloat::getSmallest(APFloat::IEEEquad(), false); 202 EXPECT_EQ(test.next(false), APFloat::opOK); 203 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 204 205 // nextDown(-0) = -nextUp(0) = -getSmallest() 206 test = APFloat::getZero(APFloat::IEEEquad(), true); 207 expected = APFloat::getSmallest(APFloat::IEEEquad(), true); 208 EXPECT_EQ(test.next(true), APFloat::opOK); 209 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 210 211 // 2. Binade Boundary Tests. 212 213 // 2a. Test denormal <-> normal binade boundaries. 214 // * nextUp(+Largest Denormal) -> +Smallest Normal. 215 // * nextDown(-Largest Denormal) -> -Smallest Normal. 216 // * nextUp(-Smallest Normal) -> -Largest Denormal. 217 // * nextDown(+Smallest Normal) -> +Largest Denormal. 218 219 // nextUp(+Largest Denormal) -> +Smallest Normal. 220 test = APFloat(APFloat::IEEEquad(), "0x0.ffffffffffffffffffffffffffffp-16382"); 221 expected = APFloat(APFloat::IEEEquad(), 222 "0x1.0000000000000000000000000000p-16382"); 223 EXPECT_EQ(test.next(false), APFloat::opOK); 224 EXPECT_FALSE(test.isDenormal()); 225 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 226 227 // nextDown(-Largest Denormal) -> -Smallest Normal. 228 test = APFloat(APFloat::IEEEquad(), 229 "-0x0.ffffffffffffffffffffffffffffp-16382"); 230 expected = APFloat(APFloat::IEEEquad(), 231 "-0x1.0000000000000000000000000000p-16382"); 232 EXPECT_EQ(test.next(true), APFloat::opOK); 233 EXPECT_FALSE(test.isDenormal()); 234 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 235 236 // nextUp(-Smallest Normal) -> -LargestDenormal. 237 test = APFloat(APFloat::IEEEquad(), 238 "-0x1.0000000000000000000000000000p-16382"); 239 expected = APFloat(APFloat::IEEEquad(), 240 "-0x0.ffffffffffffffffffffffffffffp-16382"); 241 EXPECT_EQ(test.next(false), APFloat::opOK); 242 EXPECT_TRUE(test.isDenormal()); 243 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 244 245 // nextDown(+Smallest Normal) -> +Largest Denormal. 246 test = APFloat(APFloat::IEEEquad(), 247 "+0x1.0000000000000000000000000000p-16382"); 248 expected = APFloat(APFloat::IEEEquad(), 249 "+0x0.ffffffffffffffffffffffffffffp-16382"); 250 EXPECT_EQ(test.next(true), APFloat::opOK); 251 EXPECT_TRUE(test.isDenormal()); 252 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 253 254 // 2b. Test normal <-> normal binade boundaries. 255 // * nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1. 256 // * nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1. 257 // * nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary. 258 // * nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary. 259 260 // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1. 261 test = APFloat(APFloat::IEEEquad(), "-0x1p+1"); 262 expected = APFloat(APFloat::IEEEquad(), 263 "-0x1.ffffffffffffffffffffffffffffp+0"); 264 EXPECT_EQ(test.next(false), APFloat::opOK); 265 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 266 267 // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1. 268 test = APFloat(APFloat::IEEEquad(), "0x1p+1"); 269 expected = APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp+0"); 270 EXPECT_EQ(test.next(true), APFloat::opOK); 271 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 272 273 // nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary. 274 test = APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp+0"); 275 expected = APFloat(APFloat::IEEEquad(), "0x1p+1"); 276 EXPECT_EQ(test.next(false), APFloat::opOK); 277 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 278 279 // nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary. 280 test = APFloat(APFloat::IEEEquad(), "-0x1.ffffffffffffffffffffffffffffp+0"); 281 expected = APFloat(APFloat::IEEEquad(), "-0x1p+1"); 282 EXPECT_EQ(test.next(true), APFloat::opOK); 283 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 284 285 // 2c. Test using next at binade boundaries with a direction away from the 286 // binade boundary. Away from denormal <-> normal boundaries. 287 // 288 // This is to make sure that even though we are at a binade boundary, since 289 // we are rounding away, we do not trigger the binade boundary code. Thus we 290 // test: 291 // * nextUp(-Largest Denormal) -> -Largest Denormal + inc. 292 // * nextDown(+Largest Denormal) -> +Largest Denormal - inc. 293 // * nextUp(+Smallest Normal) -> +Smallest Normal + inc. 294 // * nextDown(-Smallest Normal) -> -Smallest Normal - inc. 295 296 // nextUp(-Largest Denormal) -> -Largest Denormal + inc. 297 test = APFloat(APFloat::IEEEquad(), "-0x0.ffffffffffffffffffffffffffffp-16382"); 298 expected = APFloat(APFloat::IEEEquad(), 299 "-0x0.fffffffffffffffffffffffffffep-16382"); 300 EXPECT_EQ(test.next(false), APFloat::opOK); 301 EXPECT_TRUE(test.isDenormal()); 302 EXPECT_TRUE(test.isNegative()); 303 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 304 305 // nextDown(+Largest Denormal) -> +Largest Denormal - inc. 306 test = APFloat(APFloat::IEEEquad(), "0x0.ffffffffffffffffffffffffffffp-16382"); 307 expected = APFloat(APFloat::IEEEquad(), 308 "0x0.fffffffffffffffffffffffffffep-16382"); 309 EXPECT_EQ(test.next(true), APFloat::opOK); 310 EXPECT_TRUE(test.isDenormal()); 311 EXPECT_TRUE(!test.isNegative()); 312 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 313 314 // nextUp(+Smallest Normal) -> +Smallest Normal + inc. 315 test = APFloat(APFloat::IEEEquad(), "0x1.0000000000000000000000000000p-16382"); 316 expected = APFloat(APFloat::IEEEquad(), 317 "0x1.0000000000000000000000000001p-16382"); 318 EXPECT_EQ(test.next(false), APFloat::opOK); 319 EXPECT_TRUE(!test.isDenormal()); 320 EXPECT_TRUE(!test.isNegative()); 321 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 322 323 // nextDown(-Smallest Normal) -> -Smallest Normal - inc. 324 test = APFloat(APFloat::IEEEquad(), "-0x1.0000000000000000000000000000p-16382"); 325 expected = APFloat(APFloat::IEEEquad(), 326 "-0x1.0000000000000000000000000001p-16382"); 327 EXPECT_EQ(test.next(true), APFloat::opOK); 328 EXPECT_TRUE(!test.isDenormal()); 329 EXPECT_TRUE(test.isNegative()); 330 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 331 332 // 2d. Test values which cause our exponent to go to min exponent. This 333 // is to ensure that guards in the code to check for min exponent 334 // trigger properly. 335 // * nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382 336 // * nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) -> 337 // -0x1p-16381 338 // * nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16382 339 // * nextDown(0x1p-16382) -> 0x1.ffffffffffffffffffffffffffffp-16382 340 341 // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382 342 test = APFloat(APFloat::IEEEquad(), "-0x1p-16381"); 343 expected = APFloat(APFloat::IEEEquad(), 344 "-0x1.ffffffffffffffffffffffffffffp-16382"); 345 EXPECT_EQ(test.next(false), APFloat::opOK); 346 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 347 348 // nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) -> 349 // -0x1p-16381 350 test = APFloat(APFloat::IEEEquad(), "-0x1.ffffffffffffffffffffffffffffp-16382"); 351 expected = APFloat(APFloat::IEEEquad(), "-0x1p-16381"); 352 EXPECT_EQ(test.next(true), APFloat::opOK); 353 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 354 355 // nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16381 356 test = APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp-16382"); 357 expected = APFloat(APFloat::IEEEquad(), "0x1p-16381"); 358 EXPECT_EQ(test.next(false), APFloat::opOK); 359 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 360 361 // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382 362 test = APFloat(APFloat::IEEEquad(), "0x1p-16381"); 363 expected = APFloat(APFloat::IEEEquad(), 364 "0x1.ffffffffffffffffffffffffffffp-16382"); 365 EXPECT_EQ(test.next(true), APFloat::opOK); 366 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 367 368 // 3. Now we test both denormal/normal computation which will not cause us 369 // to go across binade boundaries. Specifically we test: 370 // * nextUp(+Denormal) -> +Denormal. 371 // * nextDown(+Denormal) -> +Denormal. 372 // * nextUp(-Denormal) -> -Denormal. 373 // * nextDown(-Denormal) -> -Denormal. 374 // * nextUp(+Normal) -> +Normal. 375 // * nextDown(+Normal) -> +Normal. 376 // * nextUp(-Normal) -> -Normal. 377 // * nextDown(-Normal) -> -Normal. 378 379 // nextUp(+Denormal) -> +Denormal. 380 test = APFloat(APFloat::IEEEquad(), 381 "0x0.ffffffffffffffffffffffff000cp-16382"); 382 expected = APFloat(APFloat::IEEEquad(), 383 "0x0.ffffffffffffffffffffffff000dp-16382"); 384 EXPECT_EQ(test.next(false), APFloat::opOK); 385 EXPECT_TRUE(test.isDenormal()); 386 EXPECT_TRUE(!test.isNegative()); 387 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 388 389 // nextDown(+Denormal) -> +Denormal. 390 test = APFloat(APFloat::IEEEquad(), 391 "0x0.ffffffffffffffffffffffff000cp-16382"); 392 expected = APFloat(APFloat::IEEEquad(), 393 "0x0.ffffffffffffffffffffffff000bp-16382"); 394 EXPECT_EQ(test.next(true), APFloat::opOK); 395 EXPECT_TRUE(test.isDenormal()); 396 EXPECT_TRUE(!test.isNegative()); 397 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 398 399 // nextUp(-Denormal) -> -Denormal. 400 test = APFloat(APFloat::IEEEquad(), 401 "-0x0.ffffffffffffffffffffffff000cp-16382"); 402 expected = APFloat(APFloat::IEEEquad(), 403 "-0x0.ffffffffffffffffffffffff000bp-16382"); 404 EXPECT_EQ(test.next(false), APFloat::opOK); 405 EXPECT_TRUE(test.isDenormal()); 406 EXPECT_TRUE(test.isNegative()); 407 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 408 409 // nextDown(-Denormal) -> -Denormal 410 test = APFloat(APFloat::IEEEquad(), 411 "-0x0.ffffffffffffffffffffffff000cp-16382"); 412 expected = APFloat(APFloat::IEEEquad(), 413 "-0x0.ffffffffffffffffffffffff000dp-16382"); 414 EXPECT_EQ(test.next(true), APFloat::opOK); 415 EXPECT_TRUE(test.isDenormal()); 416 EXPECT_TRUE(test.isNegative()); 417 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 418 419 // nextUp(+Normal) -> +Normal. 420 test = APFloat(APFloat::IEEEquad(), 421 "0x1.ffffffffffffffffffffffff000cp-16000"); 422 expected = APFloat(APFloat::IEEEquad(), 423 "0x1.ffffffffffffffffffffffff000dp-16000"); 424 EXPECT_EQ(test.next(false), APFloat::opOK); 425 EXPECT_TRUE(!test.isDenormal()); 426 EXPECT_TRUE(!test.isNegative()); 427 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 428 429 // nextDown(+Normal) -> +Normal. 430 test = APFloat(APFloat::IEEEquad(), 431 "0x1.ffffffffffffffffffffffff000cp-16000"); 432 expected = APFloat(APFloat::IEEEquad(), 433 "0x1.ffffffffffffffffffffffff000bp-16000"); 434 EXPECT_EQ(test.next(true), APFloat::opOK); 435 EXPECT_TRUE(!test.isDenormal()); 436 EXPECT_TRUE(!test.isNegative()); 437 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 438 439 // nextUp(-Normal) -> -Normal. 440 test = APFloat(APFloat::IEEEquad(), 441 "-0x1.ffffffffffffffffffffffff000cp-16000"); 442 expected = APFloat(APFloat::IEEEquad(), 443 "-0x1.ffffffffffffffffffffffff000bp-16000"); 444 EXPECT_EQ(test.next(false), APFloat::opOK); 445 EXPECT_TRUE(!test.isDenormal()); 446 EXPECT_TRUE(test.isNegative()); 447 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 448 449 // nextDown(-Normal) -> -Normal. 450 test = APFloat(APFloat::IEEEquad(), 451 "-0x1.ffffffffffffffffffffffff000cp-16000"); 452 expected = APFloat(APFloat::IEEEquad(), 453 "-0x1.ffffffffffffffffffffffff000dp-16000"); 454 EXPECT_EQ(test.next(true), APFloat::opOK); 455 EXPECT_TRUE(!test.isDenormal()); 456 EXPECT_TRUE(test.isNegative()); 457 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 458 } 459 460 TEST(APFloatTest, FMA) { 461 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven; 462 463 { 464 APFloat f1(14.5f); 465 APFloat f2(-14.5f); 466 APFloat f3(225.0f); 467 f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven); 468 EXPECT_EQ(14.75f, f1.convertToFloat()); 469 } 470 471 { 472 APFloat Val2(2.0f); 473 APFloat f1((float)1.17549435e-38F); 474 APFloat f2((float)1.17549435e-38F); 475 f1.divide(Val2, rdmd); 476 f2.divide(Val2, rdmd); 477 APFloat f3(12.0f); 478 f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven); 479 EXPECT_EQ(12.0f, f1.convertToFloat()); 480 } 481 482 // Test for correct zero sign when answer is exactly zero. 483 // fma(1.0, -1.0, 1.0) -> +ve 0. 484 { 485 APFloat f1(1.0); 486 APFloat f2(-1.0); 487 APFloat f3(1.0); 488 f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven); 489 EXPECT_TRUE(!f1.isNegative() && f1.isZero()); 490 } 491 492 // Test for correct zero sign when answer is exactly zero and rounding towards 493 // negative. 494 // fma(1.0, -1.0, 1.0) -> +ve 0. 495 { 496 APFloat f1(1.0); 497 APFloat f2(-1.0); 498 APFloat f3(1.0); 499 f1.fusedMultiplyAdd(f2, f3, APFloat::rmTowardNegative); 500 EXPECT_TRUE(f1.isNegative() && f1.isZero()); 501 } 502 503 // Test for correct (in this case -ve) sign when adding like signed zeros. 504 // Test fma(0.0, -0.0, -0.0) -> -ve 0. 505 { 506 APFloat f1(0.0); 507 APFloat f2(-0.0); 508 APFloat f3(-0.0); 509 f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven); 510 EXPECT_TRUE(f1.isNegative() && f1.isZero()); 511 } 512 513 // Test -ve sign preservation when small negative results underflow. 514 { 515 APFloat f1(APFloat::IEEEdouble(), "-0x1p-1074"); 516 APFloat f2(APFloat::IEEEdouble(), "+0x1p-1074"); 517 APFloat f3(0.0); 518 f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven); 519 EXPECT_TRUE(f1.isNegative() && f1.isZero()); 520 } 521 522 // Test x87 extended precision case from http://llvm.org/PR20728. 523 { 524 APFloat M1(APFloat::x87DoubleExtended(), 1.0); 525 APFloat M2(APFloat::x87DoubleExtended(), 1.0); 526 APFloat A(APFloat::x87DoubleExtended(), 3.0); 527 528 bool losesInfo = false; 529 M1.fusedMultiplyAdd(M1, A, APFloat::rmNearestTiesToEven); 530 M1.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &losesInfo); 531 EXPECT_FALSE(losesInfo); 532 EXPECT_EQ(4.0f, M1.convertToFloat()); 533 } 534 } 535 536 TEST(APFloatTest, MinNum) { 537 APFloat f1(1.0); 538 APFloat f2(2.0); 539 APFloat nan = APFloat::getNaN(APFloat::IEEEdouble()); 540 541 EXPECT_EQ(1.0, minnum(f1, f2).convertToDouble()); 542 EXPECT_EQ(1.0, minnum(f2, f1).convertToDouble()); 543 EXPECT_EQ(1.0, minnum(f1, nan).convertToDouble()); 544 EXPECT_EQ(1.0, minnum(nan, f1).convertToDouble()); 545 } 546 547 TEST(APFloatTest, MaxNum) { 548 APFloat f1(1.0); 549 APFloat f2(2.0); 550 APFloat nan = APFloat::getNaN(APFloat::IEEEdouble()); 551 552 EXPECT_EQ(2.0, maxnum(f1, f2).convertToDouble()); 553 EXPECT_EQ(2.0, maxnum(f2, f1).convertToDouble()); 554 EXPECT_EQ(1.0, maxnum(f1, nan).convertToDouble()); 555 EXPECT_EQ(1.0, maxnum(nan, f1).convertToDouble()); 556 } 557 558 TEST(APFloatTest, Denormal) { 559 APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven; 560 561 // Test single precision 562 { 563 const char *MinNormalStr = "1.17549435082228750797e-38"; 564 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), MinNormalStr).isDenormal()); 565 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), 0.0).isDenormal()); 566 567 APFloat Val2(APFloat::IEEEsingle(), 2.0e0); 568 APFloat T(APFloat::IEEEsingle(), MinNormalStr); 569 T.divide(Val2, rdmd); 570 EXPECT_TRUE(T.isDenormal()); 571 } 572 573 // Test double precision 574 { 575 const char *MinNormalStr = "2.22507385850720138309e-308"; 576 EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), MinNormalStr).isDenormal()); 577 EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), 0.0).isDenormal()); 578 579 APFloat Val2(APFloat::IEEEdouble(), 2.0e0); 580 APFloat T(APFloat::IEEEdouble(), MinNormalStr); 581 T.divide(Val2, rdmd); 582 EXPECT_TRUE(T.isDenormal()); 583 } 584 585 // Test Intel double-ext 586 { 587 const char *MinNormalStr = "3.36210314311209350626e-4932"; 588 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), MinNormalStr).isDenormal()); 589 EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), 0.0).isDenormal()); 590 591 APFloat Val2(APFloat::x87DoubleExtended(), 2.0e0); 592 APFloat T(APFloat::x87DoubleExtended(), MinNormalStr); 593 T.divide(Val2, rdmd); 594 EXPECT_TRUE(T.isDenormal()); 595 } 596 597 // Test quadruple precision 598 { 599 const char *MinNormalStr = "3.36210314311209350626267781732175260e-4932"; 600 EXPECT_FALSE(APFloat(APFloat::IEEEquad(), MinNormalStr).isDenormal()); 601 EXPECT_FALSE(APFloat(APFloat::IEEEquad(), 0.0).isDenormal()); 602 603 APFloat Val2(APFloat::IEEEquad(), 2.0e0); 604 APFloat T(APFloat::IEEEquad(), MinNormalStr); 605 T.divide(Val2, rdmd); 606 EXPECT_TRUE(T.isDenormal()); 607 } 608 } 609 610 TEST(APFloatTest, Zero) { 611 EXPECT_EQ(0.0f, APFloat(0.0f).convertToFloat()); 612 EXPECT_EQ(-0.0f, APFloat(-0.0f).convertToFloat()); 613 EXPECT_TRUE(APFloat(-0.0f).isNegative()); 614 615 EXPECT_EQ(0.0, APFloat(0.0).convertToDouble()); 616 EXPECT_EQ(-0.0, APFloat(-0.0).convertToDouble()); 617 EXPECT_TRUE(APFloat(-0.0).isNegative()); 618 } 619 620 TEST(APFloatTest, DecimalStringsWithoutNullTerminators) { 621 // Make sure that we can parse strings without null terminators. 622 // rdar://14323230. 623 APFloat Val(APFloat::IEEEdouble()); 624 Val.convertFromString(StringRef("0.00", 3), 625 llvm::APFloat::rmNearestTiesToEven); 626 EXPECT_EQ(Val.convertToDouble(), 0.0); 627 Val.convertFromString(StringRef("0.01", 3), 628 llvm::APFloat::rmNearestTiesToEven); 629 EXPECT_EQ(Val.convertToDouble(), 0.0); 630 Val.convertFromString(StringRef("0.09", 3), 631 llvm::APFloat::rmNearestTiesToEven); 632 EXPECT_EQ(Val.convertToDouble(), 0.0); 633 Val.convertFromString(StringRef("0.095", 4), 634 llvm::APFloat::rmNearestTiesToEven); 635 EXPECT_EQ(Val.convertToDouble(), 0.09); 636 Val.convertFromString(StringRef("0.00e+3", 7), 637 llvm::APFloat::rmNearestTiesToEven); 638 EXPECT_EQ(Val.convertToDouble(), 0.00); 639 Val.convertFromString(StringRef("0e+3", 4), 640 llvm::APFloat::rmNearestTiesToEven); 641 EXPECT_EQ(Val.convertToDouble(), 0.00); 642 643 } 644 645 TEST(APFloatTest, fromZeroDecimalString) { 646 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0").convertToDouble()); 647 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0").convertToDouble()); 648 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0").convertToDouble()); 649 650 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.").convertToDouble()); 651 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.").convertToDouble()); 652 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.").convertToDouble()); 653 654 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0").convertToDouble()); 655 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0").convertToDouble()); 656 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0").convertToDouble()); 657 658 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0").convertToDouble()); 659 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0").convertToDouble()); 660 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0").convertToDouble()); 661 662 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "00000.").convertToDouble()); 663 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+00000.").convertToDouble()); 664 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-00000.").convertToDouble()); 665 666 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), ".00000").convertToDouble()); 667 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.00000").convertToDouble()); 668 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.00000").convertToDouble()); 669 670 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0000.00000").convertToDouble()); 671 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0000.00000").convertToDouble()); 672 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0000.00000").convertToDouble()); 673 } 674 675 TEST(APFloatTest, fromZeroDecimalSingleExponentString) { 676 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e1").convertToDouble()); 677 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e1").convertToDouble()); 678 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e1").convertToDouble()); 679 680 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e+1").convertToDouble()); 681 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e+1").convertToDouble()); 682 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e+1").convertToDouble()); 683 684 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e-1").convertToDouble()); 685 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e-1").convertToDouble()); 686 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e-1").convertToDouble()); 687 688 689 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.e1").convertToDouble()); 690 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e1").convertToDouble()); 691 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e1").convertToDouble()); 692 693 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.e+1").convertToDouble()); 694 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e+1").convertToDouble()); 695 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e+1").convertToDouble()); 696 697 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.e-1").convertToDouble()); 698 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e-1").convertToDouble()); 699 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e-1").convertToDouble()); 700 701 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0e1").convertToDouble()); 702 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e1").convertToDouble()); 703 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e1").convertToDouble()); 704 705 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0e+1").convertToDouble()); 706 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e+1").convertToDouble()); 707 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e+1").convertToDouble()); 708 709 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), ".0e-1").convertToDouble()); 710 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e-1").convertToDouble()); 711 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e-1").convertToDouble()); 712 713 714 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0e1").convertToDouble()); 715 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e1").convertToDouble()); 716 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e1").convertToDouble()); 717 718 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0e+1").convertToDouble()); 719 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e+1").convertToDouble()); 720 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e+1").convertToDouble()); 721 722 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0.0e-1").convertToDouble()); 723 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e-1").convertToDouble()); 724 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e-1").convertToDouble()); 725 726 727 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "000.0000e1").convertToDouble()); 728 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+000.0000e+1").convertToDouble()); 729 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-000.0000e+1").convertToDouble()); 730 } 731 732 TEST(APFloatTest, fromZeroDecimalLargeExponentString) { 733 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e1234").convertToDouble()); 734 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e1234").convertToDouble()); 735 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e1234").convertToDouble()); 736 737 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e+1234").convertToDouble()); 738 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e+1234").convertToDouble()); 739 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e+1234").convertToDouble()); 740 741 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0e-1234").convertToDouble()); 742 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e-1234").convertToDouble()); 743 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e-1234").convertToDouble()); 744 745 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), "000.0000e1234").convertToDouble()); 746 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), "000.0000e-1234").convertToDouble()); 747 748 EXPECT_EQ(0.0, APFloat(APFloat::IEEEdouble(), StringRef("0e1234" "\0" "2", 6)).convertToDouble()); 749 } 750 751 TEST(APFloatTest, fromZeroHexadecimalString) { 752 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p1").convertToDouble()); 753 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p1").convertToDouble()); 754 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p1").convertToDouble()); 755 756 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p+1").convertToDouble()); 757 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p+1").convertToDouble()); 758 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p+1").convertToDouble()); 759 760 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p-1").convertToDouble()); 761 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p-1").convertToDouble()); 762 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p-1").convertToDouble()); 763 764 765 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1").convertToDouble()); 766 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p1").convertToDouble()); 767 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p1").convertToDouble()); 768 769 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p+1").convertToDouble()); 770 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p+1").convertToDouble()); 771 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p+1").convertToDouble()); 772 773 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p-1").convertToDouble()); 774 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p-1").convertToDouble()); 775 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p-1").convertToDouble()); 776 777 778 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.0p1").convertToDouble()); 779 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p1").convertToDouble()); 780 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p1").convertToDouble()); 781 782 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.0p+1").convertToDouble()); 783 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p+1").convertToDouble()); 784 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p+1").convertToDouble()); 785 786 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.0p-1").convertToDouble()); 787 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p-1").convertToDouble()); 788 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p-1").convertToDouble()); 789 790 791 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.0p1").convertToDouble()); 792 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p1").convertToDouble()); 793 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p1").convertToDouble()); 794 795 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.0p+1").convertToDouble()); 796 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p+1").convertToDouble()); 797 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p+1").convertToDouble()); 798 799 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.0p-1").convertToDouble()); 800 EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p-1").convertToDouble()); 801 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p-1").convertToDouble()); 802 803 804 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x00000.p1").convertToDouble()); 805 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0000.00000p1").convertToDouble()); 806 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.00000p1").convertToDouble()); 807 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1").convertToDouble()); 808 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p1234").convertToDouble()); 809 EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p1234").convertToDouble()); 810 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x00000.p1234").convertToDouble()); 811 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0000.00000p1234").convertToDouble()); 812 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.00000p1234").convertToDouble()); 813 EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1234").convertToDouble()); 814 } 815 816 TEST(APFloatTest, fromDecimalString) { 817 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1").convertToDouble()); 818 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble(), "2.").convertToDouble()); 819 EXPECT_EQ(0.5, APFloat(APFloat::IEEEdouble(), ".5").convertToDouble()); 820 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "1.0").convertToDouble()); 821 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-2").convertToDouble()); 822 EXPECT_EQ(-4.0, APFloat(APFloat::IEEEdouble(), "-4.").convertToDouble()); 823 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble(), "-.5").convertToDouble()); 824 EXPECT_EQ(-1.5, APFloat(APFloat::IEEEdouble(), "-1.5").convertToDouble()); 825 EXPECT_EQ(1.25e12, APFloat(APFloat::IEEEdouble(), "1.25e12").convertToDouble()); 826 EXPECT_EQ(1.25e+12, APFloat(APFloat::IEEEdouble(), "1.25e+12").convertToDouble()); 827 EXPECT_EQ(1.25e-12, APFloat(APFloat::IEEEdouble(), "1.25e-12").convertToDouble()); 828 EXPECT_EQ(1024.0, APFloat(APFloat::IEEEdouble(), "1024.").convertToDouble()); 829 EXPECT_EQ(1024.05, APFloat(APFloat::IEEEdouble(), "1024.05000").convertToDouble()); 830 EXPECT_EQ(0.05, APFloat(APFloat::IEEEdouble(), ".05000").convertToDouble()); 831 EXPECT_EQ(2.0, APFloat(APFloat::IEEEdouble(), "2.").convertToDouble()); 832 EXPECT_EQ(2.0e2, APFloat(APFloat::IEEEdouble(), "2.e2").convertToDouble()); 833 EXPECT_EQ(2.0e+2, APFloat(APFloat::IEEEdouble(), "2.e+2").convertToDouble()); 834 EXPECT_EQ(2.0e-2, APFloat(APFloat::IEEEdouble(), "2.e-2").convertToDouble()); 835 EXPECT_EQ(2.05e2, APFloat(APFloat::IEEEdouble(), "002.05000e2").convertToDouble()); 836 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()); 838 EXPECT_EQ(2.05e12, APFloat(APFloat::IEEEdouble(), "002.05000e12").convertToDouble()); 839 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()); 841 842 // These are "carefully selected" to overflow the fast log-base 843 // calculations in APFloat.cpp 844 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "99e99999").isInfinity()); 845 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-99e99999").isInfinity()); 846 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "1e-99999").isPosZero()); 847 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-1e-99999").isNegZero()); 848 849 EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828")); 850 } 851 852 TEST(APFloatTest, fromToStringSpecials) { 853 auto expects = [] (const char *first, const char *second) { 854 std::string roundtrip = convertToString(convertToDoubleFromString(second), 0, 3); 855 EXPECT_STREQ(first, roundtrip.c_str()); 856 }; 857 expects("+Inf", "+Inf"); 858 expects("+Inf", "INFINITY"); 859 expects("+Inf", "inf"); 860 expects("-Inf", "-Inf"); 861 expects("-Inf", "-INFINITY"); 862 expects("-Inf", "-inf"); 863 expects("NaN", "NaN"); 864 expects("NaN", "nan"); 865 expects("NaN", "-NaN"); 866 expects("NaN", "-nan"); 867 } 868 869 TEST(APFloatTest, fromHexadecimalString) { 870 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble()); 871 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p0").convertToDouble()); 872 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p0").convertToDouble()); 873 874 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p+0").convertToDouble()); 875 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p+0").convertToDouble()); 876 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p+0").convertToDouble()); 877 878 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p-0").convertToDouble()); 879 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p-0").convertToDouble()); 880 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p-0").convertToDouble()); 881 882 883 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(), "0x1p1").convertToDouble()); 884 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p1").convertToDouble()); 885 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p1").convertToDouble()); 886 887 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(), "0x1p+1").convertToDouble()); 888 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p+1").convertToDouble()); 889 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p+1").convertToDouble()); 890 891 EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble(), "0x1p-1").convertToDouble()); 892 EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble(), "+0x1p-1").convertToDouble()); 893 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble(), "-0x1p-1").convertToDouble()); 894 895 896 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(), "0x1.8p1").convertToDouble()); 897 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p1").convertToDouble()); 898 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p1").convertToDouble()); 899 900 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(), "0x1.8p+1").convertToDouble()); 901 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p+1").convertToDouble()); 902 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p+1").convertToDouble()); 903 904 EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble(), "0x1.8p-1").convertToDouble()); 905 EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble(), "+0x1.8p-1").convertToDouble()); 906 EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble(), "-0x1.8p-1").convertToDouble()); 907 908 909 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p1").convertToDouble()); 910 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p1").convertToDouble()); 911 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p1").convertToDouble()); 912 913 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p+1").convertToDouble()); 914 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p+1").convertToDouble()); 915 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p+1").convertToDouble()); 916 917 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p-1").convertToDouble()); 918 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p-1").convertToDouble()); 919 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p-1").convertToDouble()); 920 921 922 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000p1").convertToDouble()); 923 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p1").convertToDouble()); 924 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p1").convertToDouble()); 925 926 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000p+1").convertToDouble()); 927 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p+1").convertToDouble()); 928 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p+1").convertToDouble()); 929 930 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(), "0x1000p-1").convertToDouble()); 931 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000p-1").convertToDouble()); 932 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000p-1").convertToDouble()); 933 934 935 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(), "0x10p10").convertToDouble()); 936 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p10").convertToDouble()); 937 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p10").convertToDouble()); 938 939 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(), "0x10p+10").convertToDouble()); 940 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p+10").convertToDouble()); 941 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p+10").convertToDouble()); 942 943 EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble(), "0x10p-10").convertToDouble()); 944 EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble(), "+0x10p-10").convertToDouble()); 945 EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble(), "-0x10p-10").convertToDouble()); 946 947 EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble(), "0x1.1p0").convertToDouble()); 948 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble()); 949 950 EXPECT_EQ(convertToDoubleFromString("0x1p-150"), 951 convertToDoubleFromString("+0x800000000000000001.p-221")); 952 EXPECT_EQ(2251799813685248.5, 953 convertToDoubleFromString("0x80000000000004000000.010p-28")); 954 } 955 956 TEST(APFloatTest, toString) { 957 ASSERT_EQ("10", convertToString(10.0, 6, 3)); 958 ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0)); 959 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2)); 960 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2)); 961 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1)); 962 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2)); 963 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2)); 964 ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1)); 965 ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3)); 966 ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3)); 967 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1)); 968 ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0)); 969 ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0)); 970 ASSERT_EQ("10", convertToString(10.0, 6, 3, false)); 971 ASSERT_EQ("1.000000e+01", convertToString(10.0, 6, 0, false)); 972 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2, false)); 973 ASSERT_EQ("1.0100e+04", convertToString(1.01E+4, 4, 2, false)); 974 ASSERT_EQ("1.01000e+04", convertToString(1.01E+4, 5, 1, false)); 975 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2, false)); 976 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2, false)); 977 ASSERT_EQ("1.01000e-02", convertToString(1.01E-2, 5, 1, false)); 978 ASSERT_EQ("0.78539816339744828", 979 convertToString(0.78539816339744830961, 0, 3, false)); 980 ASSERT_EQ("4.94065645841246540e-324", 981 convertToString(4.9406564584124654e-324, 0, 3, false)); 982 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1, false)); 983 ASSERT_EQ("8.73183400000000010e+02", convertToString(873.1834, 0, 0, false)); 984 ASSERT_EQ("1.79769313486231570e+308", 985 convertToString(1.7976931348623157E+308, 0, 0, false)); 986 987 { 988 SmallString<64> Str; 989 APFloat UnnormalZero(APFloat::x87DoubleExtended(), APInt(80, {0, 1})); 990 UnnormalZero.toString(Str); 991 ASSERT_EQ("NaN", Str); 992 } 993 } 994 995 TEST(APFloatTest, toInteger) { 996 bool isExact = false; 997 APSInt result(5, /*isUnsigned=*/true); 998 999 EXPECT_EQ(APFloat::opOK, 1000 APFloat(APFloat::IEEEdouble(), "10") 1001 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1002 EXPECT_TRUE(isExact); 1003 EXPECT_EQ(APSInt(APInt(5, 10), true), result); 1004 1005 EXPECT_EQ(APFloat::opInvalidOp, 1006 APFloat(APFloat::IEEEdouble(), "-10") 1007 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1008 EXPECT_FALSE(isExact); 1009 EXPECT_EQ(APSInt::getMinValue(5, true), result); 1010 1011 EXPECT_EQ(APFloat::opInvalidOp, 1012 APFloat(APFloat::IEEEdouble(), "32") 1013 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1014 EXPECT_FALSE(isExact); 1015 EXPECT_EQ(APSInt::getMaxValue(5, true), result); 1016 1017 EXPECT_EQ(APFloat::opInexact, 1018 APFloat(APFloat::IEEEdouble(), "7.9") 1019 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1020 EXPECT_FALSE(isExact); 1021 EXPECT_EQ(APSInt(APInt(5, 7), true), result); 1022 1023 result.setIsUnsigned(false); 1024 EXPECT_EQ(APFloat::opOK, 1025 APFloat(APFloat::IEEEdouble(), "-10") 1026 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1027 EXPECT_TRUE(isExact); 1028 EXPECT_EQ(APSInt(APInt(5, -10, true), false), result); 1029 1030 EXPECT_EQ(APFloat::opInvalidOp, 1031 APFloat(APFloat::IEEEdouble(), "-17") 1032 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1033 EXPECT_FALSE(isExact); 1034 EXPECT_EQ(APSInt::getMinValue(5, false), result); 1035 1036 EXPECT_EQ(APFloat::opInvalidOp, 1037 APFloat(APFloat::IEEEdouble(), "16") 1038 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1039 EXPECT_FALSE(isExact); 1040 EXPECT_EQ(APSInt::getMaxValue(5, false), result); 1041 } 1042 1043 static APInt nanbits(const fltSemantics &Sem, 1044 bool SNaN, bool Negative, uint64_t fill) { 1045 APInt apfill(64, fill); 1046 if (SNaN) 1047 return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt(); 1048 else 1049 return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt(); 1050 } 1051 1052 TEST(APFloatTest, makeNaN) { 1053 ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle(), false, false, 0)); 1054 ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle(), false, true, 0)); 1055 ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle(), false, false, 0xae72)); 1056 ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle(), false, false, 0xffffae72)); 1057 ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle(), true, false, 0)); 1058 ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle(), true, true, 0)); 1059 ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle(), true, false, 0xae72)); 1060 ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle(), true, false, 0xffffae72)); 1061 1062 ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, false, 0)); 1063 ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, true, 0)); 1064 ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xae72)); 1065 ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL)); 1066 ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, false, 0)); 1067 ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, true, 0)); 1068 ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xae72)); 1069 ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL)); 1070 } 1071 1072 #ifdef GTEST_HAS_DEATH_TEST 1073 #ifndef NDEBUG 1074 TEST(APFloatTest, SemanticsDeath) { 1075 EXPECT_DEATH(APFloat(APFloat::IEEEsingle(), 0.0f).convertToDouble(), "Float semantics are not IEEEdouble"); 1076 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), 0.0 ).convertToFloat(), "Float semantics are not IEEEsingle"); 1077 } 1078 1079 TEST(APFloatTest, StringDecimalDeath) { 1080 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ""), "Invalid string length"); 1081 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+"), "String has no digits"); 1082 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-"), "String has no digits"); 1083 1084 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("\0", 1)), "Invalid character in significand"); 1085 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1\0", 2)), "Invalid character in significand"); 1086 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1" "\0" "2", 3)), "Invalid character in significand"); 1087 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1" "\0" "2e1", 5)), "Invalid character in significand"); 1088 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e\0", 3)), "Invalid character in exponent"); 1089 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e1\0", 4)), "Invalid character in exponent"); 1090 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e1" "\0" "2", 5)), "Invalid character in exponent"); 1091 1092 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0f"), "Invalid character in significand"); 1093 1094 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".."), "String contains multiple dots"); 1095 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "..0"), "String contains multiple dots"); 1096 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0.0"), "String contains multiple dots"); 1097 } 1098 1099 TEST(APFloatTest, StringDecimalSignificandDeath) { 1100 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "."), "Significand has no digits"); 1101 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+."), "Significand has no digits"); 1102 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-."), "Significand has no digits"); 1103 1104 1105 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "e"), "Significand has no digits"); 1106 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+e"), "Significand has no digits"); 1107 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-e"), "Significand has no digits"); 1108 1109 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "e1"), "Significand has no digits"); 1110 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+e1"), "Significand has no digits"); 1111 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-e1"), "Significand has no digits"); 1112 1113 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".e1"), "Significand has no digits"); 1114 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e1"), "Significand has no digits"); 1115 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e1"), "Significand has no digits"); 1116 1117 1118 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".e"), "Significand has no digits"); 1119 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e"), "Significand has no digits"); 1120 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e"), "Significand has no digits"); 1121 } 1122 1123 TEST(APFloatTest, StringDecimalExponentDeath) { 1124 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e"), "Exponent has no digits"); 1125 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1e"), "Exponent has no digits"); 1126 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1e"), "Exponent has no digits"); 1127 1128 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.e"), "Exponent has no digits"); 1129 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1.e"), "Exponent has no digits"); 1130 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1.e"), "Exponent has no digits"); 1131 1132 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e"), "Exponent has no digits"); 1133 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.1e"), "Exponent has no digits"); 1134 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.1e"), "Exponent has no digits"); 1135 1136 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.1e"), "Exponent has no digits"); 1137 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1.1e"), "Exponent has no digits"); 1138 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1.1e"), "Exponent has no digits"); 1139 1140 1141 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e+"), "Exponent has no digits"); 1142 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e-"), "Exponent has no digits"); 1143 1144 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e"), "Exponent has no digits"); 1145 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e+"), "Exponent has no digits"); 1146 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e-"), "Exponent has no digits"); 1147 1148 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e"), "Exponent has no digits"); 1149 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e+"), "Exponent has no digits"); 1150 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e-"), "Exponent has no digits"); 1151 } 1152 1153 TEST(APFloatTest, StringHexadecimalDeath) { 1154 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x"), "Invalid string"); 1155 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x"), "Invalid string"); 1156 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x"), "Invalid string"); 1157 1158 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x0"), "Hex strings require an exponent"); 1159 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0"), "Hex strings require an exponent"); 1160 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0"), "Hex strings require an exponent"); 1161 1162 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x0."), "Hex strings require an exponent"); 1163 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0."), "Hex strings require an exponent"); 1164 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0."), "Hex strings require an exponent"); 1165 1166 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.0"), "Hex strings require an exponent"); 1167 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.0"), "Hex strings require an exponent"); 1168 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.0"), "Hex strings require an exponent"); 1169 1170 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x0.0"), "Hex strings require an exponent"); 1171 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0.0"), "Hex strings require an exponent"); 1172 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0.0"), "Hex strings require an exponent"); 1173 1174 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x\0", 3)), "Invalid character in significand"); 1175 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1\0", 4)), "Invalid character in significand"); 1176 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1" "\0" "2", 5)), "Invalid character in significand"); 1177 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1" "\0" "2p1", 7)), "Invalid character in significand"); 1178 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p\0", 5)), "Invalid character in exponent"); 1179 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p1\0", 6)), "Invalid character in exponent"); 1180 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p1" "\0" "2", 7)), "Invalid character in exponent"); 1181 1182 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p0f"), "Invalid character in exponent"); 1183 1184 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x..p1"), "String contains multiple dots"); 1185 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x..0p1"), "String contains multiple dots"); 1186 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.0.0p1"), "String contains multiple dots"); 1187 } 1188 1189 TEST(APFloatTest, StringHexadecimalSignificandDeath) { 1190 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x."), "Significand has no digits"); 1191 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x."), "Significand has no digits"); 1192 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x."), "Significand has no digits"); 1193 1194 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0xp"), "Significand has no digits"); 1195 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp"), "Significand has no digits"); 1196 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp"), "Significand has no digits"); 1197 1198 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0xp+"), "Significand has no digits"); 1199 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp+"), "Significand has no digits"); 1200 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp+"), "Significand has no digits"); 1201 1202 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0xp-"), "Significand has no digits"); 1203 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp-"), "Significand has no digits"); 1204 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp-"), "Significand has no digits"); 1205 1206 1207 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.p"), "Significand has no digits"); 1208 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p"), "Significand has no digits"); 1209 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p"), "Significand has no digits"); 1210 1211 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.p+"), "Significand has no digits"); 1212 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p+"), "Significand has no digits"); 1213 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p+"), "Significand has no digits"); 1214 1215 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.p-"), "Significand has no digits"); 1216 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p-"), "Significand has no digits"); 1217 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p-"), "Significand has no digits"); 1218 } 1219 1220 TEST(APFloatTest, StringHexadecimalExponentDeath) { 1221 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p"), "Exponent has no digits"); 1222 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p"), "Exponent has no digits"); 1223 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p"), "Exponent has no digits"); 1224 1225 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p+"), "Exponent has no digits"); 1226 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p+"), "Exponent has no digits"); 1227 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p+"), "Exponent has no digits"); 1228 1229 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p-"), "Exponent has no digits"); 1230 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p-"), "Exponent has no digits"); 1231 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p-"), "Exponent has no digits"); 1232 1233 1234 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.p"), "Exponent has no digits"); 1235 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p"), "Exponent has no digits"); 1236 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p"), "Exponent has no digits"); 1237 1238 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.p+"), "Exponent has no digits"); 1239 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p+"), "Exponent has no digits"); 1240 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p+"), "Exponent has no digits"); 1241 1242 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.p-"), "Exponent has no digits"); 1243 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p-"), "Exponent has no digits"); 1244 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p-"), "Exponent has no digits"); 1245 1246 1247 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.1p"), "Exponent has no digits"); 1248 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p"), "Exponent has no digits"); 1249 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p"), "Exponent has no digits"); 1250 1251 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.1p+"), "Exponent has no digits"); 1252 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p+"), "Exponent has no digits"); 1253 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p+"), "Exponent has no digits"); 1254 1255 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.1p-"), "Exponent has no digits"); 1256 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p-"), "Exponent has no digits"); 1257 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p-"), "Exponent has no digits"); 1258 1259 1260 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.1p"), "Exponent has no digits"); 1261 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p"), "Exponent has no digits"); 1262 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p"), "Exponent has no digits"); 1263 1264 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.1p+"), "Exponent has no digits"); 1265 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p+"), "Exponent has no digits"); 1266 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p+"), "Exponent has no digits"); 1267 1268 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.1p-"), "Exponent has no digits"); 1269 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p-"), "Exponent has no digits"); 1270 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p-"), "Exponent has no digits"); 1271 } 1272 #endif 1273 #endif 1274 1275 TEST(APFloatTest, exactInverse) { 1276 APFloat inv(0.0f); 1277 1278 // Trivial operation. 1279 EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv)); 1280 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5))); 1281 EXPECT_TRUE(APFloat(2.0f).getExactInverse(&inv)); 1282 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5f))); 1283 EXPECT_TRUE(APFloat(APFloat::IEEEquad(), "2.0").getExactInverse(&inv)); 1284 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::IEEEquad(), "0.5"))); 1285 EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble(), "2.0").getExactInverse(&inv)); 1286 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble(), "0.5"))); 1287 EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended(), "2.0").getExactInverse(&inv)); 1288 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended(), "0.5"))); 1289 1290 // FLT_MIN 1291 EXPECT_TRUE(APFloat(1.17549435e-38f).getExactInverse(&inv)); 1292 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(8.5070592e+37f))); 1293 1294 // Large float, inverse is a denormal. 1295 EXPECT_FALSE(APFloat(1.7014118e38f).getExactInverse(nullptr)); 1296 // Zero 1297 EXPECT_FALSE(APFloat(0.0).getExactInverse(nullptr)); 1298 // Denormalized float 1299 EXPECT_FALSE(APFloat(1.40129846e-45f).getExactInverse(nullptr)); 1300 } 1301 1302 TEST(APFloatTest, roundToIntegral) { 1303 APFloat T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble())), P(0.0); 1304 1305 P = T; 1306 P.roundToIntegral(APFloat::rmTowardZero); 1307 EXPECT_EQ(-0.0, P.convertToDouble()); 1308 P = T; 1309 P.roundToIntegral(APFloat::rmTowardNegative); 1310 EXPECT_EQ(-1.0, P.convertToDouble()); 1311 P = T; 1312 P.roundToIntegral(APFloat::rmTowardPositive); 1313 EXPECT_EQ(-0.0, P.convertToDouble()); 1314 P = T; 1315 P.roundToIntegral(APFloat::rmNearestTiesToEven); 1316 EXPECT_EQ(-0.0, P.convertToDouble()); 1317 1318 P = S; 1319 P.roundToIntegral(APFloat::rmTowardZero); 1320 EXPECT_EQ(3.0, P.convertToDouble()); 1321 P = S; 1322 P.roundToIntegral(APFloat::rmTowardNegative); 1323 EXPECT_EQ(3.0, P.convertToDouble()); 1324 P = S; 1325 P.roundToIntegral(APFloat::rmTowardPositive); 1326 EXPECT_EQ(4.0, P.convertToDouble()); 1327 P = S; 1328 P.roundToIntegral(APFloat::rmNearestTiesToEven); 1329 EXPECT_EQ(3.0, P.convertToDouble()); 1330 1331 P = R; 1332 P.roundToIntegral(APFloat::rmTowardZero); 1333 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1334 P = R; 1335 P.roundToIntegral(APFloat::rmTowardNegative); 1336 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1337 P = R; 1338 P.roundToIntegral(APFloat::rmTowardPositive); 1339 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1340 P = R; 1341 P.roundToIntegral(APFloat::rmNearestTiesToEven); 1342 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1343 1344 P = APFloat::getZero(APFloat::IEEEdouble()); 1345 P.roundToIntegral(APFloat::rmTowardZero); 1346 EXPECT_EQ(0.0, P.convertToDouble()); 1347 P = APFloat::getZero(APFloat::IEEEdouble(), true); 1348 P.roundToIntegral(APFloat::rmTowardZero); 1349 EXPECT_EQ(-0.0, P.convertToDouble()); 1350 P = APFloat::getNaN(APFloat::IEEEdouble()); 1351 P.roundToIntegral(APFloat::rmTowardZero); 1352 EXPECT_TRUE(std::isnan(P.convertToDouble())); 1353 P = APFloat::getInf(APFloat::IEEEdouble()); 1354 P.roundToIntegral(APFloat::rmTowardZero); 1355 EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() > 0.0); 1356 P = APFloat::getInf(APFloat::IEEEdouble(), true); 1357 P.roundToIntegral(APFloat::rmTowardZero); 1358 EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() < 0.0); 1359 } 1360 1361 TEST(APFloatTest, isInteger) { 1362 APFloat T(-0.0); 1363 EXPECT_TRUE(T.isInteger()); 1364 T = APFloat(3.14159); 1365 EXPECT_FALSE(T.isInteger()); 1366 T = APFloat::getNaN(APFloat::IEEEdouble()); 1367 EXPECT_FALSE(T.isInteger()); 1368 T = APFloat::getInf(APFloat::IEEEdouble()); 1369 EXPECT_FALSE(T.isInteger()); 1370 T = APFloat::getInf(APFloat::IEEEdouble(), true); 1371 EXPECT_FALSE(T.isInteger()); 1372 T = APFloat::getLargest(APFloat::IEEEdouble()); 1373 EXPECT_TRUE(T.isInteger()); 1374 } 1375 1376 TEST(DoubleAPFloatTest, isInteger) { 1377 APFloat F1(-0.0); 1378 APFloat F2(-0.0); 1379 llvm::detail::DoubleAPFloat T(APFloat::PPCDoubleDouble(), std::move(F1), 1380 std::move(F2)); 1381 EXPECT_TRUE(T.isInteger()); 1382 APFloat F3(3.14159); 1383 APFloat F4(-0.0); 1384 llvm::detail::DoubleAPFloat T2(APFloat::PPCDoubleDouble(), std::move(F3), 1385 std::move(F4)); 1386 EXPECT_FALSE(T2.isInteger()); 1387 APFloat F5(-0.0); 1388 APFloat F6(3.14159); 1389 llvm::detail::DoubleAPFloat T3(APFloat::PPCDoubleDouble(), std::move(F5), 1390 std::move(F6)); 1391 EXPECT_FALSE(T3.isInteger()); 1392 } 1393 1394 TEST(APFloatTest, getLargest) { 1395 EXPECT_EQ(3.402823466e+38f, APFloat::getLargest(APFloat::IEEEsingle()).convertToFloat()); 1396 EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble()).convertToDouble()); 1397 } 1398 1399 TEST(APFloatTest, getSmallest) { 1400 APFloat test = APFloat::getSmallest(APFloat::IEEEsingle(), false); 1401 APFloat expected = APFloat(APFloat::IEEEsingle(), "0x0.000002p-126"); 1402 EXPECT_FALSE(test.isNegative()); 1403 EXPECT_TRUE(test.isFiniteNonZero()); 1404 EXPECT_TRUE(test.isDenormal()); 1405 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1406 1407 test = APFloat::getSmallest(APFloat::IEEEsingle(), true); 1408 expected = APFloat(APFloat::IEEEsingle(), "-0x0.000002p-126"); 1409 EXPECT_TRUE(test.isNegative()); 1410 EXPECT_TRUE(test.isFiniteNonZero()); 1411 EXPECT_TRUE(test.isDenormal()); 1412 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1413 1414 test = APFloat::getSmallest(APFloat::IEEEquad(), false); 1415 expected = APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382"); 1416 EXPECT_FALSE(test.isNegative()); 1417 EXPECT_TRUE(test.isFiniteNonZero()); 1418 EXPECT_TRUE(test.isDenormal()); 1419 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1420 1421 test = APFloat::getSmallest(APFloat::IEEEquad(), true); 1422 expected = APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382"); 1423 EXPECT_TRUE(test.isNegative()); 1424 EXPECT_TRUE(test.isFiniteNonZero()); 1425 EXPECT_TRUE(test.isDenormal()); 1426 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1427 } 1428 1429 TEST(APFloatTest, getSmallestNormalized) { 1430 APFloat test = APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 1431 APFloat expected = APFloat(APFloat::IEEEsingle(), "0x1p-126"); 1432 EXPECT_FALSE(test.isNegative()); 1433 EXPECT_TRUE(test.isFiniteNonZero()); 1434 EXPECT_FALSE(test.isDenormal()); 1435 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1436 1437 test = APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 1438 expected = APFloat(APFloat::IEEEsingle(), "-0x1p-126"); 1439 EXPECT_TRUE(test.isNegative()); 1440 EXPECT_TRUE(test.isFiniteNonZero()); 1441 EXPECT_FALSE(test.isDenormal()); 1442 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1443 1444 test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), false); 1445 expected = APFloat(APFloat::IEEEquad(), "0x1p-16382"); 1446 EXPECT_FALSE(test.isNegative()); 1447 EXPECT_TRUE(test.isFiniteNonZero()); 1448 EXPECT_FALSE(test.isDenormal()); 1449 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1450 1451 test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), true); 1452 expected = APFloat(APFloat::IEEEquad(), "-0x1p-16382"); 1453 EXPECT_TRUE(test.isNegative()); 1454 EXPECT_TRUE(test.isFiniteNonZero()); 1455 EXPECT_FALSE(test.isDenormal()); 1456 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1457 } 1458 1459 TEST(APFloatTest, getZero) { 1460 struct { 1461 const fltSemantics *semantics; 1462 const bool sign; 1463 const unsigned long long bitPattern[2]; 1464 const unsigned bitPatternLength; 1465 } const GetZeroTest[] = { 1466 { &APFloat::IEEEhalf(), false, {0, 0}, 1}, 1467 { &APFloat::IEEEhalf(), true, {0x8000ULL, 0}, 1}, 1468 { &APFloat::IEEEsingle(), false, {0, 0}, 1}, 1469 { &APFloat::IEEEsingle(), true, {0x80000000ULL, 0}, 1}, 1470 { &APFloat::IEEEdouble(), false, {0, 0}, 1}, 1471 { &APFloat::IEEEdouble(), true, {0x8000000000000000ULL, 0}, 1}, 1472 { &APFloat::IEEEquad(), false, {0, 0}, 2}, 1473 { &APFloat::IEEEquad(), true, {0, 0x8000000000000000ULL}, 2}, 1474 { &APFloat::PPCDoubleDouble(), false, {0, 0}, 2}, 1475 { &APFloat::PPCDoubleDouble(), true, {0x8000000000000000ULL, 0}, 2}, 1476 { &APFloat::x87DoubleExtended(), false, {0, 0}, 2}, 1477 { &APFloat::x87DoubleExtended(), true, {0, 0x8000ULL}, 2}, 1478 }; 1479 const unsigned NumGetZeroTests = 12; 1480 for (unsigned i = 0; i < NumGetZeroTests; ++i) { 1481 APFloat test = APFloat::getZero(*GetZeroTest[i].semantics, 1482 GetZeroTest[i].sign); 1483 const char *pattern = GetZeroTest[i].sign? "-0x0p+0" : "0x0p+0"; 1484 APFloat expected = APFloat(*GetZeroTest[i].semantics, 1485 pattern); 1486 EXPECT_TRUE(test.isZero()); 1487 EXPECT_TRUE(GetZeroTest[i].sign? test.isNegative() : !test.isNegative()); 1488 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1489 for (unsigned j = 0, je = GetZeroTest[i].bitPatternLength; j < je; ++j) { 1490 EXPECT_EQ(GetZeroTest[i].bitPattern[j], 1491 test.bitcastToAPInt().getRawData()[j]); 1492 } 1493 } 1494 } 1495 1496 TEST(APFloatTest, copySign) { 1497 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual( 1498 APFloat::copySign(APFloat(42.0), APFloat(-1.0)))); 1499 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual( 1500 APFloat::copySign(APFloat(-42.0), APFloat(1.0)))); 1501 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual( 1502 APFloat::copySign(APFloat(-42.0), APFloat(-1.0)))); 1503 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual( 1504 APFloat::copySign(APFloat(42.0), APFloat(1.0)))); 1505 } 1506 1507 TEST(APFloatTest, convert) { 1508 bool losesInfo; 1509 APFloat test(APFloat::IEEEdouble(), "1.0"); 1510 test.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &losesInfo); 1511 EXPECT_EQ(1.0f, test.convertToFloat()); 1512 EXPECT_FALSE(losesInfo); 1513 1514 test = APFloat(APFloat::x87DoubleExtended(), "0x1p-53"); 1515 test.add(APFloat(APFloat::x87DoubleExtended(), "1.0"), APFloat::rmNearestTiesToEven); 1516 test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo); 1517 EXPECT_EQ(1.0, test.convertToDouble()); 1518 EXPECT_TRUE(losesInfo); 1519 1520 test = APFloat(APFloat::IEEEquad(), "0x1p-53"); 1521 test.add(APFloat(APFloat::IEEEquad(), "1.0"), APFloat::rmNearestTiesToEven); 1522 test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo); 1523 EXPECT_EQ(1.0, test.convertToDouble()); 1524 EXPECT_TRUE(losesInfo); 1525 1526 test = APFloat(APFloat::x87DoubleExtended(), "0xf.fffffffp+28"); 1527 test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo); 1528 EXPECT_EQ(4294967295.0, test.convertToDouble()); 1529 EXPECT_FALSE(losesInfo); 1530 1531 test = APFloat::getSNaN(APFloat::IEEEsingle()); 1532 APFloat X87SNaN = APFloat::getSNaN(APFloat::x87DoubleExtended()); 1533 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1534 &losesInfo); 1535 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN)); 1536 EXPECT_FALSE(losesInfo); 1537 1538 test = APFloat::getQNaN(APFloat::IEEEsingle()); 1539 APFloat X87QNaN = APFloat::getQNaN(APFloat::x87DoubleExtended()); 1540 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1541 &losesInfo); 1542 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN)); 1543 EXPECT_FALSE(losesInfo); 1544 1545 test = APFloat::getSNaN(APFloat::x87DoubleExtended()); 1546 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1547 &losesInfo); 1548 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN)); 1549 EXPECT_FALSE(losesInfo); 1550 1551 test = APFloat::getQNaN(APFloat::x87DoubleExtended()); 1552 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1553 &losesInfo); 1554 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN)); 1555 EXPECT_FALSE(losesInfo); 1556 } 1557 1558 TEST(APFloatTest, PPCDoubleDouble) { 1559 APFloat test(APFloat::PPCDoubleDouble(), "1.0"); 1560 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]); 1561 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]); 1562 1563 // LDBL_MAX 1564 test = APFloat(APFloat::PPCDoubleDouble(), "1.79769313486231580793728971405301e+308"); 1565 EXPECT_EQ(0x7fefffffffffffffull, test.bitcastToAPInt().getRawData()[0]); 1566 EXPECT_EQ(0x7c8ffffffffffffeull, test.bitcastToAPInt().getRawData()[1]); 1567 1568 // LDBL_MIN 1569 test = APFloat(APFloat::PPCDoubleDouble(), "2.00416836000897277799610805135016e-292"); 1570 EXPECT_EQ(0x0360000000000000ull, test.bitcastToAPInt().getRawData()[0]); 1571 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]); 1572 1573 // PR30869 1574 { 1575 auto Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") + 1576 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1577 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1578 1579 Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") - 1580 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1581 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1582 1583 Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") * 1584 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1585 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1586 1587 Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") / 1588 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1589 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1590 1591 int Exp; 1592 Result = frexp(APFloat(APFloat::PPCDoubleDouble(), "1.0"), Exp, 1593 APFloat::rmNearestTiesToEven); 1594 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1595 1596 Result = scalbn(APFloat(APFloat::PPCDoubleDouble(), "1.0"), 1, 1597 APFloat::rmNearestTiesToEven); 1598 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1599 } 1600 } 1601 1602 TEST(APFloatTest, isNegative) { 1603 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1604 EXPECT_FALSE(t.isNegative()); 1605 t = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 1606 EXPECT_TRUE(t.isNegative()); 1607 1608 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNegative()); 1609 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle(), true).isNegative()); 1610 1611 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNegative()); 1612 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), true).isNegative()); 1613 1614 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNegative()); 1615 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), true).isNegative()); 1616 1617 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNegative()); 1618 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isNegative()); 1619 } 1620 1621 TEST(APFloatTest, isNormal) { 1622 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1623 EXPECT_TRUE(t.isNormal()); 1624 1625 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNormal()); 1626 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNormal()); 1627 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNormal()); 1628 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNormal()); 1629 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNormal()); 1630 } 1631 1632 TEST(APFloatTest, isFinite) { 1633 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1634 EXPECT_TRUE(t.isFinite()); 1635 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFinite()); 1636 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), false).isFinite()); 1637 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFinite()); 1638 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFinite()); 1639 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFinite()); 1640 } 1641 1642 TEST(APFloatTest, isInfinity) { 1643 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1644 EXPECT_FALSE(t.isInfinity()); 1645 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle(), false).isInfinity()); 1646 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isInfinity()); 1647 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isInfinity()); 1648 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isInfinity()); 1649 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isInfinity()); 1650 } 1651 1652 TEST(APFloatTest, isNaN) { 1653 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1654 EXPECT_FALSE(t.isNaN()); 1655 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNaN()); 1656 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNaN()); 1657 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNaN()); 1658 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNaN()); 1659 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNaN()); 1660 } 1661 1662 TEST(APFloatTest, isFiniteNonZero) { 1663 // Test positive/negative normal value. 1664 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p+0").isFiniteNonZero()); 1665 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p+0").isFiniteNonZero()); 1666 1667 // Test positive/negative denormal value. 1668 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFiniteNonZero()); 1669 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").isFiniteNonZero()); 1670 1671 // Test +/- Infinity. 1672 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1673 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1674 1675 // Test +/- Zero. 1676 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1677 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1678 1679 // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in 1680 // this instance. 1681 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1682 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1683 1684 // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in 1685 // this instance. 1686 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1687 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1688 } 1689 1690 TEST(APFloatTest, add) { 1691 // Test Special Cases against each other and normal values. 1692 1693 // TODOS/NOTES: 1694 // 1. Since we perform only default exception handling all operations with 1695 // signaling NaNs should have a result that is a quiet NaN. Currently they 1696 // return sNaN. 1697 1698 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 1699 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 1700 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 1701 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 1702 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 1703 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 1704 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 1705 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 1706 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 1707 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 1708 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 1709 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 1710 APFloat PSmallestNormalized = 1711 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 1712 APFloat MSmallestNormalized = 1713 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 1714 1715 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 1716 1717 const unsigned NumTests = 169; 1718 struct { 1719 APFloat x; 1720 APFloat y; 1721 const char *result; 1722 int status; 1723 int category; 1724 } SpecialCaseTests[NumTests] = { 1725 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1726 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1727 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 1728 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 1729 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1730 #if 0 1731 // See Note 1. 1732 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1733 #endif 1734 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1735 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1736 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1737 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1738 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1739 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1740 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 1741 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 1742 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1743 { MInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1744 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1745 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1746 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1747 #if 0 1748 // See Note 1. 1749 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1750 #endif 1751 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1752 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1753 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1754 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1755 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1756 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1757 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1758 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1759 { PZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1760 { PZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1761 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1762 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1763 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1764 #if 0 1765 // See Note 1. 1766 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1767 #endif 1768 { PZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1769 { PZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1770 { PZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1771 { PZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1772 { PZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1773 { PZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1774 { PZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1775 { PZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1776 { MZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1777 { MZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1778 { MZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1779 { MZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 1780 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1781 #if 0 1782 // See Note 1. 1783 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1784 #endif 1785 { MZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1786 { MZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1787 { MZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1788 { MZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1789 { MZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1790 { MZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1791 { MZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1792 { MZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1793 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 1794 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 1795 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 1796 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 1797 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1798 #if 0 1799 // See Note 1. 1800 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1801 #endif 1802 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1803 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1804 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1805 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1806 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1807 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1808 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 1809 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 1810 #if 0 1811 // See Note 1. 1812 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1813 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1814 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1815 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1816 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1817 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1818 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1819 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1820 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1821 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1822 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1823 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1824 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1825 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1826 #endif 1827 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1828 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1829 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1830 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1831 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1832 #if 0 1833 // See Note 1. 1834 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1835 #endif 1836 { PNormalValue, PNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal }, 1837 { PNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1838 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1839 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1840 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1841 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1842 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1843 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1844 { MNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1845 { MNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1846 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1847 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1848 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1849 #if 0 1850 // See Note 1. 1851 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1852 #endif 1853 { MNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1854 { MNormalValue, MNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal }, 1855 { MNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1856 { MNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1857 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1858 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1859 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1860 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1861 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1862 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1863 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1864 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1865 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1866 #if 0 1867 // See Note 1. 1868 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1869 #endif 1870 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1871 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1872 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 1873 { PLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1874 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1875 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1876 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1877 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1878 { MLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1879 { MLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1880 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1881 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1882 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1883 #if 0 1884 // See Note 1. 1885 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1886 #endif 1887 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1888 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1889 { MLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1890 { MLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 1891 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1892 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1893 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1894 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1895 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1896 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1897 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1898 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1899 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1900 #if 0 1901 // See Note 1. 1902 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1903 #endif 1904 { PSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1905 { PSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1906 { PSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1907 { PSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1908 { PSmallestValue, PSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal }, 1909 { PSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1910 { PSmallestValue, PSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1911 { PSmallestValue, MSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1912 { MSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1913 { MSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1914 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1915 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1916 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1917 #if 0 1918 // See Note 1. 1919 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1920 #endif 1921 { MSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1922 { MSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1923 { MSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1924 { MSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1925 { MSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1926 { MSmallestValue, MSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal }, 1927 { MSmallestValue, PSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1928 { MSmallestValue, MSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1929 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1930 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1931 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1932 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1933 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1934 #if 0 1935 // See Note 1. 1936 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1937 #endif 1938 { PSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1939 { PSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1940 { PSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1941 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1942 { PSmallestNormalized, PSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1943 { PSmallestNormalized, MSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1944 { PSmallestNormalized, PSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal }, 1945 { PSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1946 { MSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1947 { MSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1948 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1949 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1950 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1951 #if 0 1952 // See Note 1. 1953 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1954 #endif 1955 { MSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1956 { MSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1957 { MSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1958 { MSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1959 { MSmallestNormalized, PSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1960 { MSmallestNormalized, MSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1961 { MSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1962 { MSmallestNormalized, MSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal } 1963 }; 1964 1965 for (size_t i = 0; i < NumTests; ++i) { 1966 APFloat x(SpecialCaseTests[i].x); 1967 APFloat y(SpecialCaseTests[i].y); 1968 APFloat::opStatus status = x.add(y, APFloat::rmNearestTiesToEven); 1969 1970 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 1971 1972 EXPECT_TRUE(result.bitwiseIsEqual(x)); 1973 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 1974 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 1975 } 1976 } 1977 1978 TEST(APFloatTest, subtract) { 1979 // Test Special Cases against each other and normal values. 1980 1981 // TODOS/NOTES: 1982 // 1. Since we perform only default exception handling all operations with 1983 // signaling NaNs should have a result that is a quiet NaN. Currently they 1984 // return sNaN. 1985 1986 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 1987 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 1988 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 1989 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 1990 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 1991 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 1992 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 1993 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 1994 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 1995 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 1996 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 1997 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 1998 APFloat PSmallestNormalized = 1999 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 2000 APFloat MSmallestNormalized = 2001 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 2002 2003 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 2004 2005 const unsigned NumTests = 169; 2006 struct { 2007 APFloat x; 2008 APFloat y; 2009 const char *result; 2010 int status; 2011 int category; 2012 } SpecialCaseTests[NumTests] = { 2013 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2014 { PInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2015 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 2016 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 2017 { PInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2018 #if 0 2019 // See Note 1. 2020 { PInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2021 #endif 2022 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2023 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2024 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2025 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2026 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2027 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2028 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2029 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2030 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2031 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2032 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2033 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2034 { MInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2035 #if 0 2036 // See Note 1. 2037 { MInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2038 #endif 2039 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2040 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2041 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2042 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2043 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2044 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2045 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2046 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2047 { PZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2048 { PZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2049 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2050 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2051 { PZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2052 #if 0 2053 // See Note 1. 2054 { PZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2055 #endif 2056 { PZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2057 { PZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2058 { PZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2059 { PZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2060 { PZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2061 { PZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2062 { PZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2063 { PZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2064 { MZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2065 { MZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2066 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2067 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2068 { MZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2069 #if 0 2070 // See Note 1. 2071 { MZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2072 #endif 2073 { MZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2074 { MZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2075 { MZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2076 { MZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2077 { MZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2078 { MZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2079 { MZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2080 { MZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2081 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2082 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2083 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2084 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2085 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2086 #if 0 2087 // See Note 1. 2088 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2089 #endif 2090 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2091 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2092 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2093 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2094 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2095 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2096 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2097 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2098 #if 0 2099 // See Note 1. 2100 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2101 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2102 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2103 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2104 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2105 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2106 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2107 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2108 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2109 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2110 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2111 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2112 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2113 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2114 #endif 2115 { PNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2116 { PNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2117 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2118 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2119 { PNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2120 #if 0 2121 // See Note 1. 2122 { PNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2123 #endif 2124 { PNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2125 { PNormalValue, MNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal }, 2126 { PNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2127 { PNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2128 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2129 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2130 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2131 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2132 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2133 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2134 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2135 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2136 { MNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2137 #if 0 2138 // See Note 1. 2139 { MNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2140 #endif 2141 { MNormalValue, PNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal }, 2142 { MNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2143 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2144 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2145 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2146 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2147 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2148 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2149 { PLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2150 { PLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2151 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2152 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2153 { PLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2154 #if 0 2155 // See Note 1. 2156 { PLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2157 #endif 2158 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2159 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2160 { PLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2161 { PLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2162 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2163 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2164 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2165 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2166 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2167 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2168 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2169 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2170 { MLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2171 #if 0 2172 // See Note 1. 2173 { MLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2174 #endif 2175 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2176 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2177 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2178 { MLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2179 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2180 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2181 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2182 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2183 { PSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2184 { PSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2185 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2186 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2187 { PSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2188 #if 0 2189 // See Note 1. 2190 { PSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2191 #endif 2192 { PSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2193 { PSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2194 { PSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2195 { PSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2196 { PSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2197 { PSmallestValue, MSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal }, 2198 { PSmallestValue, PSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2199 { PSmallestValue, MSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2200 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2201 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2202 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2203 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2204 { MSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2205 #if 0 2206 // See Note 1. 2207 { MSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2208 #endif 2209 { MSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2210 { MSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2211 { MSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2212 { MSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2213 { MSmallestValue, PSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal }, 2214 { MSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2215 { MSmallestValue, PSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2216 { MSmallestValue, MSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2217 { PSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2218 { PSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2219 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2220 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2221 { PSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2222 #if 0 2223 // See Note 1. 2224 { PSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2225 #endif 2226 { PSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2227 { PSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2228 { PSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2229 { PSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2230 { PSmallestNormalized, PSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2231 { PSmallestNormalized, MSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2232 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2233 { PSmallestNormalized, MSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal }, 2234 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2235 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2236 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2237 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2238 { MSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2239 #if 0 2240 // See Note 1. 2241 { MSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2242 #endif 2243 { MSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2244 { MSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2245 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2246 { MSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2247 { MSmallestNormalized, PSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2248 { MSmallestNormalized, MSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2249 { MSmallestNormalized, PSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal }, 2250 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero } 2251 }; 2252 2253 for (size_t i = 0; i < NumTests; ++i) { 2254 APFloat x(SpecialCaseTests[i].x); 2255 APFloat y(SpecialCaseTests[i].y); 2256 APFloat::opStatus status = x.subtract(y, APFloat::rmNearestTiesToEven); 2257 2258 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 2259 2260 EXPECT_TRUE(result.bitwiseIsEqual(x)); 2261 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 2262 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 2263 } 2264 } 2265 2266 TEST(APFloatTest, multiply) { 2267 // Test Special Cases against each other and normal values. 2268 2269 // TODOS/NOTES: 2270 // 1. Since we perform only default exception handling all operations with 2271 // signaling NaNs should have a result that is a quiet NaN. Currently they 2272 // return sNaN. 2273 2274 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2275 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2276 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2277 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2278 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2279 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2280 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2281 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 2282 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 2283 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 2284 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 2285 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 2286 APFloat PSmallestNormalized = 2287 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 2288 APFloat MSmallestNormalized = 2289 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 2290 2291 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 2292 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact; 2293 2294 const unsigned NumTests = 169; 2295 struct { 2296 APFloat x; 2297 APFloat y; 2298 const char *result; 2299 int status; 2300 int category; 2301 } SpecialCaseTests[NumTests] = { 2302 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2303 { PInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2304 { PInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2305 { PInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2306 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2307 #if 0 2308 // See Note 1. 2309 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2310 #endif 2311 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2312 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2313 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2314 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2315 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2316 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2317 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2318 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2319 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2320 { MInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2321 { MInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2322 { MInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2323 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2324 #if 0 2325 // See Note 1. 2326 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2327 #endif 2328 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2329 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2330 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2331 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2332 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2333 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2334 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2335 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2336 { PZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2337 { PZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2338 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2339 { PZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2340 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2341 #if 0 2342 // See Note 1. 2343 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2344 #endif 2345 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2346 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2347 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2348 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2349 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2350 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2351 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2352 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2353 { MZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2354 { MZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2355 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2356 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2357 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2358 #if 0 2359 // See Note 1. 2360 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2361 #endif 2362 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2363 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2364 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2365 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2366 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2367 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2368 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2369 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2370 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2371 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2372 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2373 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2374 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2375 #if 0 2376 // See Note 1. 2377 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2378 #endif 2379 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2380 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2381 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2382 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2383 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2384 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2385 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2386 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2387 #if 0 2388 // See Note 1. 2389 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2390 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2391 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2392 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2393 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2394 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2395 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2396 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2397 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2398 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2399 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2400 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2401 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2402 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2403 #endif 2404 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2405 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2406 { PNormalValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2407 { PNormalValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2408 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2409 #if 0 2410 // See Note 1. 2411 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2412 #endif 2413 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2414 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2415 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2416 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2417 { PNormalValue, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2418 { PNormalValue, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2419 { PNormalValue, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2420 { PNormalValue, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2421 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2422 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2423 { MNormalValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2424 { MNormalValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2425 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2426 #if 0 2427 // See Note 1. 2428 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2429 #endif 2430 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2431 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2432 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2433 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2434 { MNormalValue, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2435 { MNormalValue, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2436 { MNormalValue, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2437 { MNormalValue, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2438 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2439 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2440 { PLargestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2441 { PLargestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2442 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2443 #if 0 2444 // See Note 1. 2445 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2446 #endif 2447 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2448 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2449 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2450 { PLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2451 { PLargestValue, PSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2452 { PLargestValue, MSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2453 { PLargestValue, PSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2454 { PLargestValue, MSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2455 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2456 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2457 { MLargestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2458 { MLargestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2459 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2460 #if 0 2461 // See Note 1. 2462 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2463 #endif 2464 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2465 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2466 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2467 { MLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2468 { MLargestValue, PSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2469 { MLargestValue, MSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2470 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2471 { MLargestValue, MSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2472 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2473 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2474 { PSmallestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2475 { PSmallestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2476 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2477 #if 0 2478 // See Note 1. 2479 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2480 #endif 2481 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2482 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2483 { PSmallestValue, PLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2484 { PSmallestValue, MLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2485 { PSmallestValue, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2486 { PSmallestValue, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2487 { PSmallestValue, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2488 { PSmallestValue, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2489 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2490 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2491 { MSmallestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2492 { MSmallestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2493 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2494 #if 0 2495 // See Note 1. 2496 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2497 #endif 2498 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2499 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2500 { MSmallestValue, PLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2501 { MSmallestValue, MLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2502 { MSmallestValue, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2503 { MSmallestValue, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2504 { MSmallestValue, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2505 { MSmallestValue, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2506 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2507 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2508 { PSmallestNormalized, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2509 { PSmallestNormalized, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2510 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2511 #if 0 2512 // See Note 1. 2513 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2514 #endif 2515 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2516 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2517 { PSmallestNormalized, PLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2518 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2519 { PSmallestNormalized, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2520 { PSmallestNormalized, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2521 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2522 { PSmallestNormalized, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2523 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2524 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2525 { MSmallestNormalized, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2526 { MSmallestNormalized, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2527 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2528 #if 0 2529 // See Note 1. 2530 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2531 #endif 2532 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2533 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2534 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2535 { MSmallestNormalized, MLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2536 { MSmallestNormalized, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2537 { MSmallestNormalized, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2538 { MSmallestNormalized, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2539 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero } 2540 }; 2541 2542 for (size_t i = 0; i < NumTests; ++i) { 2543 APFloat x(SpecialCaseTests[i].x); 2544 APFloat y(SpecialCaseTests[i].y); 2545 APFloat::opStatus status = x.multiply(y, APFloat::rmNearestTiesToEven); 2546 2547 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 2548 2549 EXPECT_TRUE(result.bitwiseIsEqual(x)); 2550 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 2551 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 2552 } 2553 } 2554 2555 TEST(APFloatTest, divide) { 2556 // Test Special Cases against each other and normal values. 2557 2558 // TODOS/NOTES: 2559 // 1. Since we perform only default exception handling all operations with 2560 // signaling NaNs should have a result that is a quiet NaN. Currently they 2561 // return sNaN. 2562 2563 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2564 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2565 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2566 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2567 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2568 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2569 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2570 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 2571 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 2572 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 2573 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 2574 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 2575 APFloat PSmallestNormalized = 2576 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 2577 APFloat MSmallestNormalized = 2578 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 2579 2580 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 2581 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact; 2582 2583 const unsigned NumTests = 169; 2584 struct { 2585 APFloat x; 2586 APFloat y; 2587 const char *result; 2588 int status; 2589 int category; 2590 } SpecialCaseTests[NumTests] = { 2591 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2592 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2593 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 2594 { PInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2595 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2596 #if 0 2597 // See Note 1. 2598 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2599 #endif 2600 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2601 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2602 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2603 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2604 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2605 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2606 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2607 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2608 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2609 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2610 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2611 { MInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 2612 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2613 #if 0 2614 // See Note 1. 2615 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2616 #endif 2617 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2618 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2619 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2620 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2621 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2622 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2623 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2624 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2625 { PZero, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2626 { PZero, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2627 { PZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2628 { PZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2629 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2630 #if 0 2631 // See Note 1. 2632 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2633 #endif 2634 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2635 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2636 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2637 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2638 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2639 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2640 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2641 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2642 { MZero, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2643 { MZero, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2644 { MZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2645 { MZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2646 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2647 #if 0 2648 // See Note 1. 2649 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2650 #endif 2651 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2652 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2653 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2654 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2655 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2656 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2657 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2658 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2659 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2660 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2661 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2662 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2663 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2664 #if 0 2665 // See Note 1. 2666 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2667 #endif 2668 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2669 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2670 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2671 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2672 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2673 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2674 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2675 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2676 #if 0 2677 // See Note 1. 2678 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2679 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2680 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2681 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2682 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2683 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2684 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2685 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2686 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2687 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2688 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2689 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2690 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2691 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2692 #endif 2693 { PNormalValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2694 { PNormalValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2695 { PNormalValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2696 { PNormalValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2697 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2698 #if 0 2699 // See Note 1. 2700 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2701 #endif 2702 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2703 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2704 { PNormalValue, PLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2705 { PNormalValue, MLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2706 { PNormalValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2707 { PNormalValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2708 { PNormalValue, PSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2709 { PNormalValue, MSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2710 { MNormalValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2711 { MNormalValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2712 { MNormalValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2713 { MNormalValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2714 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2715 #if 0 2716 // See Note 1. 2717 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2718 #endif 2719 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2720 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2721 { MNormalValue, PLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2722 { MNormalValue, MLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2723 { MNormalValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2724 { MNormalValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2725 { MNormalValue, PSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2726 { MNormalValue, MSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2727 { PLargestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2728 { PLargestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2729 { PLargestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2730 { PLargestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2731 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2732 #if 0 2733 // See Note 1. 2734 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2735 #endif 2736 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2737 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2738 { PLargestValue, PLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2739 { PLargestValue, MLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2740 { PLargestValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2741 { PLargestValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2742 { PLargestValue, PSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity }, 2743 { PLargestValue, MSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity }, 2744 { MLargestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2745 { MLargestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2746 { MLargestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2747 { MLargestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2748 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2749 #if 0 2750 // See Note 1. 2751 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2752 #endif 2753 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2754 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2755 { MLargestValue, PLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2756 { MLargestValue, MLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2757 { MLargestValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2758 { MLargestValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2759 { MLargestValue, PSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity }, 2760 { MLargestValue, MSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity }, 2761 { PSmallestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2762 { PSmallestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2763 { PSmallestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2764 { PSmallestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2765 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2766 #if 0 2767 // See Note 1. 2768 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2769 #endif 2770 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2771 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2772 { PSmallestValue, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2773 { PSmallestValue, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2774 { PSmallestValue, PSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2775 { PSmallestValue, MSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2776 { PSmallestValue, PSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2777 { PSmallestValue, MSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2778 { MSmallestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2779 { MSmallestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2780 { MSmallestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2781 { MSmallestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2782 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2783 #if 0 2784 // See Note 1. 2785 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2786 #endif 2787 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2788 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2789 { MSmallestValue, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2790 { MSmallestValue, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2791 { MSmallestValue, PSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2792 { MSmallestValue, MSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2793 { MSmallestValue, PSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2794 { MSmallestValue, MSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2795 { PSmallestNormalized, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2796 { PSmallestNormalized, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2797 { PSmallestNormalized, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2798 { PSmallestNormalized, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2799 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2800 #if 0 2801 // See Note 1. 2802 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2803 #endif 2804 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2805 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2806 { PSmallestNormalized, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2807 { PSmallestNormalized, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2808 { PSmallestNormalized, PSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2809 { PSmallestNormalized, MSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2810 { PSmallestNormalized, PSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2811 { PSmallestNormalized, MSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2812 { MSmallestNormalized, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2813 { MSmallestNormalized, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2814 { MSmallestNormalized, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2815 { MSmallestNormalized, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2816 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2817 #if 0 2818 // See Note 1. 2819 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2820 #endif 2821 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2822 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2823 { MSmallestNormalized, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2824 { MSmallestNormalized, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2825 { MSmallestNormalized, PSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2826 { MSmallestNormalized, MSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2827 { MSmallestNormalized, PSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2828 { MSmallestNormalized, MSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2829 }; 2830 2831 for (size_t i = 0; i < NumTests; ++i) { 2832 APFloat x(SpecialCaseTests[i].x); 2833 APFloat y(SpecialCaseTests[i].y); 2834 APFloat::opStatus status = x.divide(y, APFloat::rmNearestTiesToEven); 2835 2836 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 2837 2838 EXPECT_TRUE(result.bitwiseIsEqual(x)); 2839 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 2840 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 2841 } 2842 } 2843 2844 TEST(APFloatTest, operatorOverloads) { 2845 // This is mostly testing that these operator overloads compile. 2846 APFloat One = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2847 APFloat Two = APFloat(APFloat::IEEEsingle(), "0x2p+0"); 2848 EXPECT_TRUE(Two.bitwiseIsEqual(One + One)); 2849 EXPECT_TRUE(One.bitwiseIsEqual(Two - One)); 2850 EXPECT_TRUE(Two.bitwiseIsEqual(One * Two)); 2851 EXPECT_TRUE(One.bitwiseIsEqual(Two / Two)); 2852 } 2853 2854 TEST(APFloatTest, abs) { 2855 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2856 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2857 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2858 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2859 APFloat PQNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2860 APFloat MQNaN = APFloat::getNaN(APFloat::IEEEsingle(), true); 2861 APFloat PSNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2862 APFloat MSNaN = APFloat::getSNaN(APFloat::IEEEsingle(), true); 2863 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2864 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 2865 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 2866 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 2867 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 2868 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 2869 APFloat PSmallestNormalized = 2870 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 2871 APFloat MSmallestNormalized = 2872 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 2873 2874 EXPECT_TRUE(PInf.bitwiseIsEqual(abs(PInf))); 2875 EXPECT_TRUE(PInf.bitwiseIsEqual(abs(MInf))); 2876 EXPECT_TRUE(PZero.bitwiseIsEqual(abs(PZero))); 2877 EXPECT_TRUE(PZero.bitwiseIsEqual(abs(MZero))); 2878 EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(PQNaN))); 2879 EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(MQNaN))); 2880 EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(PSNaN))); 2881 EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(MSNaN))); 2882 EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(PNormalValue))); 2883 EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(MNormalValue))); 2884 EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(PLargestValue))); 2885 EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(MLargestValue))); 2886 EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(PSmallestValue))); 2887 EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(MSmallestValue))); 2888 EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(PSmallestNormalized))); 2889 EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(MSmallestNormalized))); 2890 } 2891 2892 TEST(APFloatTest, neg) { 2893 APFloat One = APFloat(APFloat::IEEEsingle(), "1.0"); 2894 APFloat NegOne = APFloat(APFloat::IEEEsingle(), "-1.0"); 2895 APFloat Zero = APFloat::getZero(APFloat::IEEEsingle(), false); 2896 APFloat NegZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2897 APFloat Inf = APFloat::getInf(APFloat::IEEEsingle(), false); 2898 APFloat NegInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2899 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2900 APFloat NegQNaN = APFloat::getNaN(APFloat::IEEEsingle(), true); 2901 2902 EXPECT_TRUE(NegOne.bitwiseIsEqual(neg(One))); 2903 EXPECT_TRUE(One.bitwiseIsEqual(neg(NegOne))); 2904 EXPECT_TRUE(NegZero.bitwiseIsEqual(neg(Zero))); 2905 EXPECT_TRUE(Zero.bitwiseIsEqual(neg(NegZero))); 2906 EXPECT_TRUE(NegInf.bitwiseIsEqual(neg(Inf))); 2907 EXPECT_TRUE(Inf.bitwiseIsEqual(neg(NegInf))); 2908 EXPECT_TRUE(NegInf.bitwiseIsEqual(neg(Inf))); 2909 EXPECT_TRUE(Inf.bitwiseIsEqual(neg(NegInf))); 2910 EXPECT_TRUE(NegQNaN.bitwiseIsEqual(neg(QNaN))); 2911 EXPECT_TRUE(QNaN.bitwiseIsEqual(neg(NegQNaN))); 2912 } 2913 2914 TEST(APFloatTest, ilogb) { 2915 EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), false))); 2916 EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), true))); 2917 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1024"))); 2918 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023"))); 2919 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023"))); 2920 EXPECT_EQ(-51, ilogb(APFloat(APFloat::IEEEdouble(), "0x1p-51"))); 2921 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1023"))); 2922 EXPECT_EQ(-2, ilogb(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1"))); 2923 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1023"))); 2924 EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), false))); 2925 EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), true))); 2926 2927 2928 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+0"))); 2929 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "-0x1p+0"))); 2930 EXPECT_EQ(42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+42"))); 2931 EXPECT_EQ(-42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p-42"))); 2932 2933 EXPECT_EQ(APFloat::IEK_Inf, 2934 ilogb(APFloat::getInf(APFloat::IEEEsingle(), false))); 2935 EXPECT_EQ(APFloat::IEK_Inf, 2936 ilogb(APFloat::getInf(APFloat::IEEEsingle(), true))); 2937 EXPECT_EQ(APFloat::IEK_Zero, 2938 ilogb(APFloat::getZero(APFloat::IEEEsingle(), false))); 2939 EXPECT_EQ(APFloat::IEK_Zero, 2940 ilogb(APFloat::getZero(APFloat::IEEEsingle(), true))); 2941 EXPECT_EQ(APFloat::IEK_NaN, 2942 ilogb(APFloat::getNaN(APFloat::IEEEsingle(), false))); 2943 EXPECT_EQ(APFloat::IEK_NaN, 2944 ilogb(APFloat::getSNaN(APFloat::IEEEsingle(), false))); 2945 2946 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), false))); 2947 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), true))); 2948 2949 EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), false))); 2950 EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), true))); 2951 EXPECT_EQ(-126, 2952 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false))); 2953 EXPECT_EQ(-126, 2954 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true))); 2955 } 2956 2957 TEST(APFloatTest, scalbn) { 2958 2959 const APFloat::roundingMode RM = APFloat::rmNearestTiesToEven; 2960 EXPECT_TRUE( 2961 APFloat(APFloat::IEEEsingle(), "0x1p+0") 2962 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 0, RM))); 2963 EXPECT_TRUE( 2964 APFloat(APFloat::IEEEsingle(), "0x1p+42") 2965 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 42, RM))); 2966 EXPECT_TRUE( 2967 APFloat(APFloat::IEEEsingle(), "0x1p-42") 2968 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), -42, RM))); 2969 2970 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2971 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2972 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2973 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2974 APFloat QPNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2975 APFloat QMNaN = APFloat::getNaN(APFloat::IEEEsingle(), true); 2976 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2977 2978 EXPECT_TRUE(PInf.bitwiseIsEqual(scalbn(PInf, 0, RM))); 2979 EXPECT_TRUE(MInf.bitwiseIsEqual(scalbn(MInf, 0, RM))); 2980 EXPECT_TRUE(PZero.bitwiseIsEqual(scalbn(PZero, 0, RM))); 2981 EXPECT_TRUE(MZero.bitwiseIsEqual(scalbn(MZero, 0, RM))); 2982 EXPECT_TRUE(QPNaN.bitwiseIsEqual(scalbn(QPNaN, 0, RM))); 2983 EXPECT_TRUE(QMNaN.bitwiseIsEqual(scalbn(QMNaN, 0, RM))); 2984 EXPECT_FALSE(scalbn(SNaN, 0, RM).isSignaling()); 2985 2986 APFloat ScalbnSNaN = scalbn(SNaN, 1, RM); 2987 EXPECT_TRUE(ScalbnSNaN.isNaN() && !ScalbnSNaN.isSignaling()); 2988 2989 // Make sure highest bit of payload is preserved. 2990 const APInt Payload(64, (UINT64_C(1) << 50) | 2991 (UINT64_C(1) << 49) | 2992 (UINT64_C(1234) << 32) | 2993 1); 2994 2995 APFloat SNaNWithPayload = APFloat::getSNaN(APFloat::IEEEdouble(), false, 2996 &Payload); 2997 APFloat QuietPayload = scalbn(SNaNWithPayload, 1, RM); 2998 EXPECT_TRUE(QuietPayload.isNaN() && !QuietPayload.isSignaling()); 2999 EXPECT_EQ(Payload, QuietPayload.bitcastToAPInt().getLoBits(51)); 3000 3001 EXPECT_TRUE(PInf.bitwiseIsEqual( 3002 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 128, RM))); 3003 EXPECT_TRUE(MInf.bitwiseIsEqual( 3004 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p+0"), 128, RM))); 3005 EXPECT_TRUE(PInf.bitwiseIsEqual( 3006 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+127"), 1, RM))); 3007 EXPECT_TRUE(PZero.bitwiseIsEqual( 3008 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-127"), -127, RM))); 3009 EXPECT_TRUE(MZero.bitwiseIsEqual( 3010 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -127, RM))); 3011 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").bitwiseIsEqual( 3012 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -22, RM))); 3013 EXPECT_TRUE(PZero.bitwiseIsEqual( 3014 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-126"), -24, RM))); 3015 3016 3017 APFloat SmallestF64 = APFloat::getSmallest(APFloat::IEEEdouble(), false); 3018 APFloat NegSmallestF64 = APFloat::getSmallest(APFloat::IEEEdouble(), true); 3019 3020 APFloat LargestF64 = APFloat::getLargest(APFloat::IEEEdouble(), false); 3021 APFloat NegLargestF64 = APFloat::getLargest(APFloat::IEEEdouble(), true); 3022 3023 APFloat SmallestNormalizedF64 3024 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false); 3025 APFloat NegSmallestNormalizedF64 3026 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true); 3027 3028 APFloat LargestDenormalF64(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023"); 3029 APFloat NegLargestDenormalF64(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023"); 3030 3031 3032 EXPECT_TRUE(SmallestF64.bitwiseIsEqual( 3033 scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-1074"), 0, RM))); 3034 EXPECT_TRUE(NegSmallestF64.bitwiseIsEqual( 3035 scalbn(APFloat(APFloat::IEEEdouble(), "-0x1p-1074"), 0, RM))); 3036 3037 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023") 3038 .bitwiseIsEqual(scalbn(SmallestF64, 2097, RM))); 3039 3040 EXPECT_TRUE(scalbn(SmallestF64, -2097, RM).isPosZero()); 3041 EXPECT_TRUE(scalbn(SmallestF64, -2098, RM).isPosZero()); 3042 EXPECT_TRUE(scalbn(SmallestF64, -2099, RM).isPosZero()); 3043 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1022") 3044 .bitwiseIsEqual(scalbn(SmallestF64, 2096, RM))); 3045 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023") 3046 .bitwiseIsEqual(scalbn(SmallestF64, 2097, RM))); 3047 EXPECT_TRUE(scalbn(SmallestF64, 2098, RM).isInfinity()); 3048 EXPECT_TRUE(scalbn(SmallestF64, 2099, RM).isInfinity()); 3049 3050 // Test for integer overflows when adding to exponent. 3051 EXPECT_TRUE(scalbn(SmallestF64, -INT_MAX, RM).isPosZero()); 3052 EXPECT_TRUE(scalbn(LargestF64, INT_MAX, RM).isInfinity()); 3053 3054 EXPECT_TRUE(LargestDenormalF64 3055 .bitwiseIsEqual(scalbn(LargestDenormalF64, 0, RM))); 3056 EXPECT_TRUE(NegLargestDenormalF64 3057 .bitwiseIsEqual(scalbn(NegLargestDenormalF64, 0, RM))); 3058 3059 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1022") 3060 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1, RM))); 3061 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1021") 3062 .bitwiseIsEqual(scalbn(NegLargestDenormalF64, 2, RM))); 3063 3064 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1") 3065 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1024, RM))); 3066 EXPECT_TRUE(scalbn(LargestDenormalF64, -1023, RM).isPosZero()); 3067 EXPECT_TRUE(scalbn(LargestDenormalF64, -1024, RM).isPosZero()); 3068 EXPECT_TRUE(scalbn(LargestDenormalF64, -2048, RM).isPosZero()); 3069 EXPECT_TRUE(scalbn(LargestDenormalF64, 2047, RM).isInfinity()); 3070 EXPECT_TRUE(scalbn(LargestDenormalF64, 2098, RM).isInfinity()); 3071 EXPECT_TRUE(scalbn(LargestDenormalF64, 2099, RM).isInfinity()); 3072 3073 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-2") 3074 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1021, RM))); 3075 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1") 3076 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1022, RM))); 3077 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+0") 3078 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1023, RM))); 3079 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1023") 3080 .bitwiseIsEqual(scalbn(LargestDenormalF64, 2046, RM))); 3081 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+974") 3082 .bitwiseIsEqual(scalbn(SmallestF64, 2048, RM))); 3083 3084 APFloat RandomDenormalF64(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51"); 3085 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-972") 3086 .bitwiseIsEqual(scalbn(RandomDenormalF64, -1023, RM))); 3087 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1") 3088 .bitwiseIsEqual(scalbn(RandomDenormalF64, -52, RM))); 3089 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-2") 3090 .bitwiseIsEqual(scalbn(RandomDenormalF64, -53, RM))); 3091 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+0") 3092 .bitwiseIsEqual(scalbn(RandomDenormalF64, -51, RM))); 3093 3094 EXPECT_TRUE(scalbn(RandomDenormalF64, -2097, RM).isPosZero()); 3095 EXPECT_TRUE(scalbn(RandomDenormalF64, -2090, RM).isPosZero()); 3096 3097 3098 EXPECT_TRUE( 3099 APFloat(APFloat::IEEEdouble(), "-0x1p-1073") 3100 .bitwiseIsEqual(scalbn(NegLargestF64, -2097, RM))); 3101 3102 EXPECT_TRUE( 3103 APFloat(APFloat::IEEEdouble(), "-0x1p-1024") 3104 .bitwiseIsEqual(scalbn(NegLargestF64, -2048, RM))); 3105 3106 EXPECT_TRUE( 3107 APFloat(APFloat::IEEEdouble(), "0x1p-1073") 3108 .bitwiseIsEqual(scalbn(LargestF64, -2097, RM))); 3109 3110 EXPECT_TRUE( 3111 APFloat(APFloat::IEEEdouble(), "0x1p-1074") 3112 .bitwiseIsEqual(scalbn(LargestF64, -2098, RM))); 3113 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1074") 3114 .bitwiseIsEqual(scalbn(NegLargestF64, -2098, RM))); 3115 EXPECT_TRUE(scalbn(NegLargestF64, -2099, RM).isNegZero()); 3116 EXPECT_TRUE(scalbn(LargestF64, 1, RM).isInfinity()); 3117 3118 3119 EXPECT_TRUE( 3120 APFloat(APFloat::IEEEdouble(), "0x1p+0") 3121 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p+52"), -52, RM))); 3122 3123 EXPECT_TRUE( 3124 APFloat(APFloat::IEEEdouble(), "0x1p-103") 3125 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-51"), -52, RM))); 3126 } 3127 3128 TEST(APFloatTest, frexp) { 3129 const APFloat::roundingMode RM = APFloat::rmNearestTiesToEven; 3130 3131 APFloat PZero = APFloat::getZero(APFloat::IEEEdouble(), false); 3132 APFloat MZero = APFloat::getZero(APFloat::IEEEdouble(), true); 3133 APFloat One(1.0); 3134 APFloat MOne(-1.0); 3135 APFloat Two(2.0); 3136 APFloat MTwo(-2.0); 3137 3138 APFloat LargestDenormal(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023"); 3139 APFloat NegLargestDenormal(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023"); 3140 3141 APFloat Smallest = APFloat::getSmallest(APFloat::IEEEdouble(), false); 3142 APFloat NegSmallest = APFloat::getSmallest(APFloat::IEEEdouble(), true); 3143 3144 APFloat Largest = APFloat::getLargest(APFloat::IEEEdouble(), false); 3145 APFloat NegLargest = APFloat::getLargest(APFloat::IEEEdouble(), true); 3146 3147 APFloat PInf = APFloat::getInf(APFloat::IEEEdouble(), false); 3148 APFloat MInf = APFloat::getInf(APFloat::IEEEdouble(), true); 3149 3150 APFloat QPNaN = APFloat::getNaN(APFloat::IEEEdouble(), false); 3151 APFloat QMNaN = APFloat::getNaN(APFloat::IEEEdouble(), true); 3152 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEdouble(), false); 3153 3154 // Make sure highest bit of payload is preserved. 3155 const APInt Payload(64, (UINT64_C(1) << 50) | 3156 (UINT64_C(1) << 49) | 3157 (UINT64_C(1234) << 32) | 3158 1); 3159 3160 APFloat SNaNWithPayload = APFloat::getSNaN(APFloat::IEEEdouble(), false, 3161 &Payload); 3162 3163 APFloat SmallestNormalized 3164 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false); 3165 APFloat NegSmallestNormalized 3166 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true); 3167 3168 int Exp; 3169 APFloat Frac(APFloat::IEEEdouble()); 3170 3171 3172 Frac = frexp(PZero, Exp, RM); 3173 EXPECT_EQ(0, Exp); 3174 EXPECT_TRUE(Frac.isPosZero()); 3175 3176 Frac = frexp(MZero, Exp, RM); 3177 EXPECT_EQ(0, Exp); 3178 EXPECT_TRUE(Frac.isNegZero()); 3179 3180 3181 Frac = frexp(One, Exp, RM); 3182 EXPECT_EQ(1, Exp); 3183 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac)); 3184 3185 Frac = frexp(MOne, Exp, RM); 3186 EXPECT_EQ(1, Exp); 3187 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac)); 3188 3189 Frac = frexp(LargestDenormal, Exp, RM); 3190 EXPECT_EQ(-1022, Exp); 3191 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1").bitwiseIsEqual(Frac)); 3192 3193 Frac = frexp(NegLargestDenormal, Exp, RM); 3194 EXPECT_EQ(-1022, Exp); 3195 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1").bitwiseIsEqual(Frac)); 3196 3197 3198 Frac = frexp(Smallest, Exp, RM); 3199 EXPECT_EQ(-1073, Exp); 3200 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac)); 3201 3202 Frac = frexp(NegSmallest, Exp, RM); 3203 EXPECT_EQ(-1073, Exp); 3204 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac)); 3205 3206 3207 Frac = frexp(Largest, Exp, RM); 3208 EXPECT_EQ(1024, Exp); 3209 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffffffffffffp-1").bitwiseIsEqual(Frac)); 3210 3211 Frac = frexp(NegLargest, Exp, RM); 3212 EXPECT_EQ(1024, Exp); 3213 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.fffffffffffffp-1").bitwiseIsEqual(Frac)); 3214 3215 3216 Frac = frexp(PInf, Exp, RM); 3217 EXPECT_EQ(INT_MAX, Exp); 3218 EXPECT_TRUE(Frac.isInfinity() && !Frac.isNegative()); 3219 3220 Frac = frexp(MInf, Exp, RM); 3221 EXPECT_EQ(INT_MAX, Exp); 3222 EXPECT_TRUE(Frac.isInfinity() && Frac.isNegative()); 3223 3224 Frac = frexp(QPNaN, Exp, RM); 3225 EXPECT_EQ(INT_MIN, Exp); 3226 EXPECT_TRUE(Frac.isNaN()); 3227 3228 Frac = frexp(QMNaN, Exp, RM); 3229 EXPECT_EQ(INT_MIN, Exp); 3230 EXPECT_TRUE(Frac.isNaN()); 3231 3232 Frac = frexp(SNaN, Exp, RM); 3233 EXPECT_EQ(INT_MIN, Exp); 3234 EXPECT_TRUE(Frac.isNaN() && !Frac.isSignaling()); 3235 3236 Frac = frexp(SNaNWithPayload, Exp, RM); 3237 EXPECT_EQ(INT_MIN, Exp); 3238 EXPECT_TRUE(Frac.isNaN() && !Frac.isSignaling()); 3239 EXPECT_EQ(Payload, Frac.bitcastToAPInt().getLoBits(51)); 3240 3241 Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1"), Exp, RM); 3242 EXPECT_EQ(-1, Exp); 3243 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1").bitwiseIsEqual(Frac)); 3244 3245 Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x1p-51"), Exp, RM); 3246 EXPECT_EQ(-50, Exp); 3247 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac)); 3248 3249 Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51"), Exp, RM); 3250 EXPECT_EQ(52, Exp); 3251 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1").bitwiseIsEqual(Frac)); 3252 } 3253 3254 TEST(APFloatTest, mod) { 3255 { 3256 APFloat f1(APFloat::IEEEdouble(), "1.5"); 3257 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3258 APFloat expected(APFloat::IEEEdouble(), "0.5"); 3259 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3260 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3261 } 3262 { 3263 APFloat f1(APFloat::IEEEdouble(), "0.5"); 3264 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3265 APFloat expected(APFloat::IEEEdouble(), "0.5"); 3266 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3267 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3268 } 3269 { 3270 APFloat f1(APFloat::IEEEdouble(), "0x1.3333333333333p-2"); // 0.3 3271 APFloat f2(APFloat::IEEEdouble(), "0x1.47ae147ae147bp-7"); // 0.01 3272 APFloat expected(APFloat::IEEEdouble(), 3273 "0x1.47ae147ae1471p-7"); // 0.009999999999999983 3274 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3275 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3276 } 3277 { 3278 APFloat f1(APFloat::IEEEdouble(), "0x1p64"); // 1.8446744073709552e19 3279 APFloat f2(APFloat::IEEEdouble(), "1.5"); 3280 APFloat expected(APFloat::IEEEdouble(), "1.0"); 3281 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3282 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3283 } 3284 { 3285 APFloat f1(APFloat::IEEEdouble(), "0x1p1000"); 3286 APFloat f2(APFloat::IEEEdouble(), "0x1p-1000"); 3287 APFloat expected(APFloat::IEEEdouble(), "0.0"); 3288 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3289 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3290 } 3291 { 3292 APFloat f1(APFloat::IEEEdouble(), "0.0"); 3293 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3294 APFloat expected(APFloat::IEEEdouble(), "0.0"); 3295 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3296 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3297 } 3298 { 3299 APFloat f1(APFloat::IEEEdouble(), "1.0"); 3300 APFloat f2(APFloat::IEEEdouble(), "0.0"); 3301 EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp); 3302 EXPECT_TRUE(f1.isNaN()); 3303 } 3304 { 3305 APFloat f1(APFloat::IEEEdouble(), "0.0"); 3306 APFloat f2(APFloat::IEEEdouble(), "0.0"); 3307 EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp); 3308 EXPECT_TRUE(f1.isNaN()); 3309 } 3310 { 3311 APFloat f1 = APFloat::getInf(APFloat::IEEEdouble(), false); 3312 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3313 EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp); 3314 EXPECT_TRUE(f1.isNaN()); 3315 } 3316 { 3317 APFloat f1(APFloat::IEEEdouble(), "-4.0"); 3318 APFloat f2(APFloat::IEEEdouble(), "-2.0"); 3319 APFloat expected(APFloat::IEEEdouble(), "-0.0"); 3320 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3321 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3322 } 3323 { 3324 APFloat f1(APFloat::IEEEdouble(), "-4.0"); 3325 APFloat f2(APFloat::IEEEdouble(), "2.0"); 3326 APFloat expected(APFloat::IEEEdouble(), "-0.0"); 3327 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3328 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3329 } 3330 } 3331 3332 TEST(APFloatTest, PPCDoubleDoubleAddSpecial) { 3333 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, 3334 APFloat::fltCategory, APFloat::roundingMode>; 3335 DataType Data[] = { 3336 // (1 + 0) + (-1 + 0) = fcZero 3337 std::make_tuple(0x3ff0000000000000ull, 0, 0xbff0000000000000ull, 0, 3338 APFloat::fcZero, APFloat::rmNearestTiesToEven), 3339 // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity 3340 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3341 0x7948000000000000ull, 0ull, APFloat::fcInfinity, 3342 APFloat::rmNearestTiesToEven), 3343 // TODO: change the 4th 0x75effffffffffffe to 0x75efffffffffffff when 3344 // semPPCDoubleDoubleLegacy is gone. 3345 // LDBL_MAX + (1.011111... >> (1023 - 106) + (1.1111111...0 >> (1023 - 3346 // 160))) = fcNormal 3347 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3348 0x7947ffffffffffffull, 0x75effffffffffffeull, 3349 APFloat::fcNormal, APFloat::rmNearestTiesToEven), 3350 // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity 3351 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3352 0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3353 APFloat::fcInfinity, APFloat::rmNearestTiesToEven), 3354 // NaN + (1 + 0) = fcNaN 3355 std::make_tuple(0x7ff8000000000000ull, 0, 0x3ff0000000000000ull, 0, 3356 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3357 }; 3358 3359 for (auto Tp : Data) { 3360 uint64_t Op1[2], Op2[2]; 3361 APFloat::fltCategory Expected; 3362 APFloat::roundingMode RM; 3363 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected, RM) = Tp; 3364 3365 { 3366 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3367 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3368 A1.add(A2, RM); 3369 3370 EXPECT_EQ(Expected, A1.getCategory()) 3371 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1], 3372 Op2[0], Op2[1]) 3373 .str(); 3374 } 3375 { 3376 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3377 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3378 A2.add(A1, RM); 3379 3380 EXPECT_EQ(Expected, A2.getCategory()) 3381 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1], 3382 Op1[0], Op1[1]) 3383 .str(); 3384 } 3385 } 3386 } 3387 3388 TEST(APFloatTest, PPCDoubleDoubleAdd) { 3389 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3390 uint64_t, APFloat::roundingMode>; 3391 DataType Data[] = { 3392 // (1 + 0) + (1e-105 + 0) = (1 + 1e-105) 3393 std::make_tuple(0x3ff0000000000000ull, 0, 0x3960000000000000ull, 0, 3394 0x3ff0000000000000ull, 0x3960000000000000ull, 3395 APFloat::rmNearestTiesToEven), 3396 // (1 + 0) + (1e-106 + 0) = (1 + 1e-106) 3397 std::make_tuple(0x3ff0000000000000ull, 0, 0x3950000000000000ull, 0, 3398 0x3ff0000000000000ull, 0x3950000000000000ull, 3399 APFloat::rmNearestTiesToEven), 3400 // (1 + 1e-106) + (1e-106 + 0) = (1 + 1e-105) 3401 std::make_tuple(0x3ff0000000000000ull, 0x3950000000000000ull, 3402 0x3950000000000000ull, 0, 0x3ff0000000000000ull, 3403 0x3960000000000000ull, APFloat::rmNearestTiesToEven), 3404 // (1 + 0) + (epsilon + 0) = (1 + epsilon) 3405 std::make_tuple(0x3ff0000000000000ull, 0, 0x0000000000000001ull, 0, 3406 0x3ff0000000000000ull, 0x0000000000000001ull, 3407 APFloat::rmNearestTiesToEven), 3408 // TODO: change 0xf950000000000000 to 0xf940000000000000, when 3409 // semPPCDoubleDoubleLegacy is gone. 3410 // (DBL_MAX - 1 << (1023 - 105)) + (1 << (1023 - 53) + 0) = DBL_MAX + 3411 // 1.11111... << (1023 - 52) 3412 std::make_tuple(0x7fefffffffffffffull, 0xf950000000000000ull, 3413 0x7c90000000000000ull, 0, 0x7fefffffffffffffull, 3414 0x7c8ffffffffffffeull, APFloat::rmNearestTiesToEven), 3415 // TODO: change 0xf950000000000000 to 0xf940000000000000, when 3416 // semPPCDoubleDoubleLegacy is gone. 3417 // (1 << (1023 - 53) + 0) + (DBL_MAX - 1 << (1023 - 105)) = DBL_MAX + 3418 // 1.11111... << (1023 - 52) 3419 std::make_tuple(0x7c90000000000000ull, 0, 0x7fefffffffffffffull, 3420 0xf950000000000000ull, 0x7fefffffffffffffull, 3421 0x7c8ffffffffffffeull, APFloat::rmNearestTiesToEven), 3422 }; 3423 3424 for (auto Tp : Data) { 3425 uint64_t Op1[2], Op2[2], Expected[2]; 3426 APFloat::roundingMode RM; 3427 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3428 3429 { 3430 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3431 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3432 A1.add(A2, RM); 3433 3434 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3435 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1], 3436 Op2[0], Op2[1]) 3437 .str(); 3438 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3439 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1], 3440 Op2[0], Op2[1]) 3441 .str(); 3442 } 3443 { 3444 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3445 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3446 A2.add(A1, RM); 3447 3448 EXPECT_EQ(Expected[0], A2.bitcastToAPInt().getRawData()[0]) 3449 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1], 3450 Op1[0], Op1[1]) 3451 .str(); 3452 EXPECT_EQ(Expected[1], A2.bitcastToAPInt().getRawData()[1]) 3453 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1], 3454 Op1[0], Op1[1]) 3455 .str(); 3456 } 3457 } 3458 } 3459 3460 TEST(APFloatTest, PPCDoubleDoubleSubtract) { 3461 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3462 uint64_t, APFloat::roundingMode>; 3463 DataType Data[] = { 3464 // (1 + 0) - (-1e-105 + 0) = (1 + 1e-105) 3465 std::make_tuple(0x3ff0000000000000ull, 0, 0xb960000000000000ull, 0, 3466 0x3ff0000000000000ull, 0x3960000000000000ull, 3467 APFloat::rmNearestTiesToEven), 3468 // (1 + 0) - (-1e-106 + 0) = (1 + 1e-106) 3469 std::make_tuple(0x3ff0000000000000ull, 0, 0xb950000000000000ull, 0, 3470 0x3ff0000000000000ull, 0x3950000000000000ull, 3471 APFloat::rmNearestTiesToEven), 3472 }; 3473 3474 for (auto Tp : Data) { 3475 uint64_t Op1[2], Op2[2], Expected[2]; 3476 APFloat::roundingMode RM; 3477 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3478 3479 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3480 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3481 A1.subtract(A2, RM); 3482 3483 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3484 << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3485 Op2[1]) 3486 .str(); 3487 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3488 << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3489 Op2[1]) 3490 .str(); 3491 } 3492 } 3493 3494 TEST(APFloatTest, PPCDoubleDoubleMultiplySpecial) { 3495 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, 3496 APFloat::fltCategory, APFloat::roundingMode>; 3497 DataType Data[] = { 3498 // fcNaN * fcNaN = fcNaN 3499 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0, 3500 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3501 // fcNaN * fcZero = fcNaN 3502 std::make_tuple(0x7ff8000000000000ull, 0, 0, 0, APFloat::fcNaN, 3503 APFloat::rmNearestTiesToEven), 3504 // fcNaN * fcInfinity = fcNaN 3505 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff0000000000000ull, 0, 3506 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3507 // fcNaN * fcNormal = fcNaN 3508 std::make_tuple(0x7ff8000000000000ull, 0, 0x3ff0000000000000ull, 0, 3509 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3510 // fcInfinity * fcInfinity = fcInfinity 3511 std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0, 3512 APFloat::fcInfinity, APFloat::rmNearestTiesToEven), 3513 // fcInfinity * fcZero = fcNaN 3514 std::make_tuple(0x7ff0000000000000ull, 0, 0, 0, APFloat::fcNaN, 3515 APFloat::rmNearestTiesToEven), 3516 // fcInfinity * fcNormal = fcInfinity 3517 std::make_tuple(0x7ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, 3518 APFloat::fcInfinity, APFloat::rmNearestTiesToEven), 3519 // fcZero * fcZero = fcZero 3520 std::make_tuple(0, 0, 0, 0, APFloat::fcZero, 3521 APFloat::rmNearestTiesToEven), 3522 // fcZero * fcNormal = fcZero 3523 std::make_tuple(0, 0, 0x3ff0000000000000ull, 0, APFloat::fcZero, 3524 APFloat::rmNearestTiesToEven), 3525 }; 3526 3527 for (auto Tp : Data) { 3528 uint64_t Op1[2], Op2[2]; 3529 APFloat::fltCategory Expected; 3530 APFloat::roundingMode RM; 3531 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected, RM) = Tp; 3532 3533 { 3534 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3535 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3536 A1.multiply(A2, RM); 3537 3538 EXPECT_EQ(Expected, A1.getCategory()) 3539 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1], 3540 Op2[0], Op2[1]) 3541 .str(); 3542 } 3543 { 3544 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3545 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3546 A2.multiply(A1, RM); 3547 3548 EXPECT_EQ(Expected, A2.getCategory()) 3549 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1], 3550 Op1[0], Op1[1]) 3551 .str(); 3552 } 3553 } 3554 } 3555 3556 TEST(APFloatTest, PPCDoubleDoubleMultiply) { 3557 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3558 uint64_t, APFloat::roundingMode>; 3559 DataType Data[] = { 3560 // 1/3 * 3 = 1.0 3561 std::make_tuple(0x3fd5555555555555ull, 0x3c75555555555556ull, 3562 0x4008000000000000ull, 0, 0x3ff0000000000000ull, 0, 3563 APFloat::rmNearestTiesToEven), 3564 // (1 + epsilon) * (1 + 0) = fcZero 3565 std::make_tuple(0x3ff0000000000000ull, 0x0000000000000001ull, 3566 0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 3567 0x0000000000000001ull, APFloat::rmNearestTiesToEven), 3568 // (1 + epsilon) * (1 + epsilon) = 1 + 2 * epsilon 3569 std::make_tuple(0x3ff0000000000000ull, 0x0000000000000001ull, 3570 0x3ff0000000000000ull, 0x0000000000000001ull, 3571 0x3ff0000000000000ull, 0x0000000000000002ull, 3572 APFloat::rmNearestTiesToEven), 3573 // -(1 + epsilon) * (1 + epsilon) = -1 3574 std::make_tuple(0xbff0000000000000ull, 0x0000000000000001ull, 3575 0x3ff0000000000000ull, 0x0000000000000001ull, 3576 0xbff0000000000000ull, 0, APFloat::rmNearestTiesToEven), 3577 // (0.5 + 0) * (1 + 2 * epsilon) = 0.5 + epsilon 3578 std::make_tuple(0x3fe0000000000000ull, 0, 0x3ff0000000000000ull, 3579 0x0000000000000002ull, 0x3fe0000000000000ull, 3580 0x0000000000000001ull, APFloat::rmNearestTiesToEven), 3581 // (0.5 + 0) * (1 + epsilon) = 0.5 3582 std::make_tuple(0x3fe0000000000000ull, 0, 0x3ff0000000000000ull, 3583 0x0000000000000001ull, 0x3fe0000000000000ull, 0, 3584 APFloat::rmNearestTiesToEven), 3585 // __LDBL_MAX__ * (1 + 1 << 106) = inf 3586 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3587 0x3ff0000000000000ull, 0x3950000000000000ull, 3588 0x7ff0000000000000ull, 0, APFloat::rmNearestTiesToEven), 3589 // __LDBL_MAX__ * (1 + 1 << 107) > __LDBL_MAX__, but not inf, yes =_=||| 3590 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3591 0x3ff0000000000000ull, 0x3940000000000000ull, 3592 0x7fefffffffffffffull, 0x7c8fffffffffffffull, 3593 APFloat::rmNearestTiesToEven), 3594 // __LDBL_MAX__ * (1 + 1 << 108) = __LDBL_MAX__ 3595 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3596 0x3ff0000000000000ull, 0x3930000000000000ull, 3597 0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3598 APFloat::rmNearestTiesToEven), 3599 }; 3600 3601 for (auto Tp : Data) { 3602 uint64_t Op1[2], Op2[2], Expected[2]; 3603 APFloat::roundingMode RM; 3604 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3605 3606 { 3607 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3608 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3609 A1.multiply(A2, RM); 3610 3611 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3612 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1], 3613 Op2[0], Op2[1]) 3614 .str(); 3615 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3616 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1], 3617 Op2[0], Op2[1]) 3618 .str(); 3619 } 3620 { 3621 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3622 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3623 A2.multiply(A1, RM); 3624 3625 EXPECT_EQ(Expected[0], A2.bitcastToAPInt().getRawData()[0]) 3626 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1], 3627 Op1[0], Op1[1]) 3628 .str(); 3629 EXPECT_EQ(Expected[1], A2.bitcastToAPInt().getRawData()[1]) 3630 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1], 3631 Op1[0], Op1[1]) 3632 .str(); 3633 } 3634 } 3635 } 3636 3637 TEST(APFloatTest, PPCDoubleDoubleDivide) { 3638 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3639 uint64_t, APFloat::roundingMode>; 3640 // TODO: Only a sanity check for now. Add more edge cases when the 3641 // double-double algorithm is implemented. 3642 DataType Data[] = { 3643 // 1 / 3 = 1/3 3644 std::make_tuple(0x3ff0000000000000ull, 0, 0x4008000000000000ull, 0, 3645 0x3fd5555555555555ull, 0x3c75555555555556ull, 3646 APFloat::rmNearestTiesToEven), 3647 }; 3648 3649 for (auto Tp : Data) { 3650 uint64_t Op1[2], Op2[2], Expected[2]; 3651 APFloat::roundingMode RM; 3652 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3653 3654 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3655 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3656 A1.divide(A2, RM); 3657 3658 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3659 << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3660 Op2[1]) 3661 .str(); 3662 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3663 << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3664 Op2[1]) 3665 .str(); 3666 } 3667 } 3668 3669 TEST(APFloatTest, PPCDoubleDoubleRemainder) { 3670 using DataType = 3671 std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>; 3672 DataType Data[] = { 3673 // remainder(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53) 3674 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3675 0x3ff4000000000000ull, 0x3ca4000000000000ull, 3676 0x3fe0000000000000ull, 0x3c90000000000000ull), 3677 // remainder(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (-0.5 - 0.5 << 53) 3678 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3679 0x3ffc000000000000ull, 0x3cac000000000000ull, 3680 0xbfe0000000000000ull, 0xbc90000000000000ull), 3681 }; 3682 3683 for (auto Tp : Data) { 3684 uint64_t Op1[2], Op2[2], Expected[2]; 3685 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1]) = Tp; 3686 3687 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3688 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3689 A1.remainder(A2); 3690 3691 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3692 << formatv("remainder({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3693 Op2[0], Op2[1]) 3694 .str(); 3695 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3696 << formatv("remainder(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], 3697 Op1[1], Op2[0], Op2[1]) 3698 .str(); 3699 } 3700 } 3701 3702 TEST(APFloatTest, PPCDoubleDoubleMod) { 3703 using DataType = 3704 std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>; 3705 DataType Data[] = { 3706 // mod(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53) 3707 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3708 0x3ff4000000000000ull, 0x3ca4000000000000ull, 3709 0x3fe0000000000000ull, 0x3c90000000000000ull), 3710 // mod(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (1.25 + 1.25 << 53) 3711 // 0xbc98000000000000 doesn't seem right, but it's what we currently have. 3712 // TODO: investigate 3713 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3714 0x3ffc000000000000ull, 0x3cac000000000000ull, 3715 0x3ff4000000000001ull, 0xbc98000000000000ull), 3716 }; 3717 3718 for (auto Tp : Data) { 3719 uint64_t Op1[2], Op2[2], Expected[2]; 3720 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1]) = Tp; 3721 3722 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3723 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3724 A1.mod(A2); 3725 3726 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3727 << formatv("fmod(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3728 Op2[0], Op2[1]) 3729 .str(); 3730 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3731 << formatv("fmod(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3732 Op2[0], Op2[1]) 3733 .str(); 3734 } 3735 } 3736 3737 TEST(APFloatTest, PPCDoubleDoubleFMA) { 3738 // Sanity check for now. 3739 APFloat A(APFloat::PPCDoubleDouble(), "2"); 3740 A.fusedMultiplyAdd(APFloat(APFloat::PPCDoubleDouble(), "3"), 3741 APFloat(APFloat::PPCDoubleDouble(), "4"), 3742 APFloat::rmNearestTiesToEven); 3743 EXPECT_EQ(APFloat::cmpEqual, 3744 APFloat(APFloat::PPCDoubleDouble(), "10").compare(A)); 3745 } 3746 3747 TEST(APFloatTest, PPCDoubleDoubleRoundToIntegral) { 3748 { 3749 APFloat A(APFloat::PPCDoubleDouble(), "1.5"); 3750 A.roundToIntegral(APFloat::rmNearestTiesToEven); 3751 EXPECT_EQ(APFloat::cmpEqual, 3752 APFloat(APFloat::PPCDoubleDouble(), "2").compare(A)); 3753 } 3754 { 3755 APFloat A(APFloat::PPCDoubleDouble(), "2.5"); 3756 A.roundToIntegral(APFloat::rmNearestTiesToEven); 3757 EXPECT_EQ(APFloat::cmpEqual, 3758 APFloat(APFloat::PPCDoubleDouble(), "2").compare(A)); 3759 } 3760 } 3761 3762 TEST(APFloatTest, PPCDoubleDoubleCompare) { 3763 using DataType = 3764 std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, APFloat::cmpResult>; 3765 3766 DataType Data[] = { 3767 // (1 + 0) = (1 + 0) 3768 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, 3769 APFloat::cmpEqual), 3770 // (1 + 0) < (1.00...1 + 0) 3771 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 0, 3772 APFloat::cmpLessThan), 3773 // (1.00...1 + 0) > (1 + 0) 3774 std::make_tuple(0x3ff0000000000001ull, 0, 0x3ff0000000000000ull, 0, 3775 APFloat::cmpGreaterThan), 3776 // (1 + 0) < (1 + epsilon) 3777 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 3778 0x0000000000000001ull, APFloat::cmpLessThan), 3779 // NaN != NaN 3780 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0, 3781 APFloat::cmpUnordered), 3782 // (1 + 0) != NaN 3783 std::make_tuple(0x3ff0000000000000ull, 0, 0x7ff8000000000000ull, 0, 3784 APFloat::cmpUnordered), 3785 // Inf = Inf 3786 std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0, 3787 APFloat::cmpEqual), 3788 }; 3789 3790 for (auto Tp : Data) { 3791 uint64_t Op1[2], Op2[2]; 3792 APFloat::cmpResult Expected; 3793 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected) = Tp; 3794 3795 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3796 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3797 EXPECT_EQ(Expected, A1.compare(A2)) 3798 << formatv("compare(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3799 Op2[0], Op2[1]) 3800 .str(); 3801 } 3802 } 3803 3804 TEST(APFloatTest, PPCDoubleDoubleBitwiseIsEqual) { 3805 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, bool>; 3806 3807 DataType Data[] = { 3808 // (1 + 0) = (1 + 0) 3809 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, true), 3810 // (1 + 0) != (1.00...1 + 0) 3811 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 0, 3812 false), 3813 // NaN = NaN 3814 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0, true), 3815 // NaN != NaN with a different bit pattern 3816 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 3817 0x3ff0000000000000ull, false), 3818 // Inf = Inf 3819 std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0, true), 3820 }; 3821 3822 for (auto Tp : Data) { 3823 uint64_t Op1[2], Op2[2]; 3824 bool Expected; 3825 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected) = Tp; 3826 3827 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3828 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3829 EXPECT_EQ(Expected, A1.bitwiseIsEqual(A2)) 3830 << formatv("({0:x} + {1:x}) = ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3831 Op2[1]) 3832 .str(); 3833 } 3834 } 3835 3836 TEST(APFloatTest, PPCDoubleDoubleHashValue) { 3837 uint64_t Data1[] = {0x3ff0000000000001ull, 0x0000000000000001ull}; 3838 uint64_t Data2[] = {0x3ff0000000000001ull, 0}; 3839 // The hash values are *hopefully* different. 3840 EXPECT_NE( 3841 hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data1))), 3842 hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data2)))); 3843 } 3844 3845 TEST(APFloatTest, PPCDoubleDoubleChangeSign) { 3846 uint64_t Data[] = { 3847 0x400f000000000000ull, 0xbcb0000000000000ull, 3848 }; 3849 APFloat Float(APFloat::PPCDoubleDouble(), APInt(128, 2, Data)); 3850 { 3851 APFloat Actual = 3852 APFloat::copySign(Float, APFloat(APFloat::IEEEdouble(), "1")); 3853 EXPECT_EQ(0x400f000000000000ull, Actual.bitcastToAPInt().getRawData()[0]); 3854 EXPECT_EQ(0xbcb0000000000000ull, Actual.bitcastToAPInt().getRawData()[1]); 3855 } 3856 { 3857 APFloat Actual = 3858 APFloat::copySign(Float, APFloat(APFloat::IEEEdouble(), "-1")); 3859 EXPECT_EQ(0xc00f000000000000ull, Actual.bitcastToAPInt().getRawData()[0]); 3860 EXPECT_EQ(0x3cb0000000000000ull, Actual.bitcastToAPInt().getRawData()[1]); 3861 } 3862 } 3863 3864 TEST(APFloatTest, PPCDoubleDoubleFactories) { 3865 { 3866 uint64_t Data[] = { 3867 0, 0, 3868 }; 3869 EXPECT_EQ(APInt(128, 2, Data), 3870 APFloat::getZero(APFloat::PPCDoubleDouble()).bitcastToAPInt()); 3871 } 3872 { 3873 uint64_t Data[] = { 3874 0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3875 }; 3876 EXPECT_EQ(APInt(128, 2, Data), 3877 APFloat::getLargest(APFloat::PPCDoubleDouble()).bitcastToAPInt()); 3878 } 3879 { 3880 uint64_t Data[] = { 3881 0x0000000000000001ull, 0, 3882 }; 3883 EXPECT_EQ( 3884 APInt(128, 2, Data), 3885 APFloat::getSmallest(APFloat::PPCDoubleDouble()).bitcastToAPInt()); 3886 } 3887 { 3888 uint64_t Data[] = {0x0360000000000000ull, 0}; 3889 EXPECT_EQ(APInt(128, 2, Data), 3890 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble()) 3891 .bitcastToAPInt()); 3892 } 3893 { 3894 uint64_t Data[] = { 3895 0x8000000000000000ull, 0x0000000000000000ull, 3896 }; 3897 EXPECT_EQ( 3898 APInt(128, 2, Data), 3899 APFloat::getZero(APFloat::PPCDoubleDouble(), true).bitcastToAPInt()); 3900 } 3901 { 3902 uint64_t Data[] = { 3903 0xffefffffffffffffull, 0xfc8ffffffffffffeull, 3904 }; 3905 EXPECT_EQ( 3906 APInt(128, 2, Data), 3907 APFloat::getLargest(APFloat::PPCDoubleDouble(), true).bitcastToAPInt()); 3908 } 3909 { 3910 uint64_t Data[] = { 3911 0x8000000000000001ull, 0x0000000000000000ull, 3912 }; 3913 EXPECT_EQ(APInt(128, 2, Data), 3914 APFloat::getSmallest(APFloat::PPCDoubleDouble(), true) 3915 .bitcastToAPInt()); 3916 } 3917 { 3918 uint64_t Data[] = { 3919 0x8360000000000000ull, 0x0000000000000000ull, 3920 }; 3921 EXPECT_EQ(APInt(128, 2, Data), 3922 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble(), true) 3923 .bitcastToAPInt()); 3924 } 3925 EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isSmallest()); 3926 EXPECT_TRUE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isLargest()); 3927 } 3928 3929 TEST(APFloatTest, PPCDoubleDoubleIsDenormal) { 3930 EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isDenormal()); 3931 EXPECT_FALSE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isDenormal()); 3932 EXPECT_FALSE( 3933 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble()).isDenormal()); 3934 { 3935 // (4 + 3) is not normalized 3936 uint64_t Data[] = { 3937 0x4010000000000000ull, 0x4008000000000000ull, 3938 }; 3939 EXPECT_TRUE( 3940 APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data)).isDenormal()); 3941 } 3942 } 3943 3944 TEST(APFloatTest, PPCDoubleDoubleScalbn) { 3945 // 3.0 + 3.0 << 53 3946 uint64_t Input[] = { 3947 0x4008000000000000ull, 0x3cb8000000000000ull, 3948 }; 3949 APFloat Result = 3950 scalbn(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input)), 1, 3951 APFloat::rmNearestTiesToEven); 3952 // 6.0 + 6.0 << 53 3953 EXPECT_EQ(0x4018000000000000ull, Result.bitcastToAPInt().getRawData()[0]); 3954 EXPECT_EQ(0x3cc8000000000000ull, Result.bitcastToAPInt().getRawData()[1]); 3955 } 3956 3957 TEST(APFloatTest, PPCDoubleDoubleFrexp) { 3958 // 3.0 + 3.0 << 53 3959 uint64_t Input[] = { 3960 0x4008000000000000ull, 0x3cb8000000000000ull, 3961 }; 3962 int Exp; 3963 // 0.75 + 0.75 << 53 3964 APFloat Result = 3965 frexp(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input)), Exp, 3966 APFloat::rmNearestTiesToEven); 3967 EXPECT_EQ(2, Exp); 3968 EXPECT_EQ(0x3fe8000000000000ull, Result.bitcastToAPInt().getRawData()[0]); 3969 EXPECT_EQ(0x3c98000000000000ull, Result.bitcastToAPInt().getRawData()[1]); 3970 } 3971 } 3972