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, fromHexadecimalString) { 853 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble()); 854 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p0").convertToDouble()); 855 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p0").convertToDouble()); 856 857 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p+0").convertToDouble()); 858 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p+0").convertToDouble()); 859 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p+0").convertToDouble()); 860 861 EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(), "0x1p-0").convertToDouble()); 862 EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p-0").convertToDouble()); 863 EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p-0").convertToDouble()); 864 865 866 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(), "0x1p1").convertToDouble()); 867 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p1").convertToDouble()); 868 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p1").convertToDouble()); 869 870 EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(), "0x1p+1").convertToDouble()); 871 EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p+1").convertToDouble()); 872 EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p+1").convertToDouble()); 873 874 EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble(), "0x1p-1").convertToDouble()); 875 EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble(), "+0x1p-1").convertToDouble()); 876 EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble(), "-0x1p-1").convertToDouble()); 877 878 879 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(), "0x1.8p1").convertToDouble()); 880 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p1").convertToDouble()); 881 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p1").convertToDouble()); 882 883 EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(), "0x1.8p+1").convertToDouble()); 884 EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p+1").convertToDouble()); 885 EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p+1").convertToDouble()); 886 887 EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble(), "0x1.8p-1").convertToDouble()); 888 EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble(), "+0x1.8p-1").convertToDouble()); 889 EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble(), "-0x1.8p-1").convertToDouble()); 890 891 892 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p1").convertToDouble()); 893 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p1").convertToDouble()); 894 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p1").convertToDouble()); 895 896 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p+1").convertToDouble()); 897 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p+1").convertToDouble()); 898 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p+1").convertToDouble()); 899 900 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(), "0x1000.000p-1").convertToDouble()); 901 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p-1").convertToDouble()); 902 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p-1").convertToDouble()); 903 904 905 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000p1").convertToDouble()); 906 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p1").convertToDouble()); 907 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p1").convertToDouble()); 908 909 EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(), "0x1000p+1").convertToDouble()); 910 EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p+1").convertToDouble()); 911 EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p+1").convertToDouble()); 912 913 EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(), "0x1000p-1").convertToDouble()); 914 EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000p-1").convertToDouble()); 915 EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000p-1").convertToDouble()); 916 917 918 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(), "0x10p10").convertToDouble()); 919 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p10").convertToDouble()); 920 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p10").convertToDouble()); 921 922 EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(), "0x10p+10").convertToDouble()); 923 EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p+10").convertToDouble()); 924 EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p+10").convertToDouble()); 925 926 EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble(), "0x10p-10").convertToDouble()); 927 EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble(), "+0x10p-10").convertToDouble()); 928 EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble(), "-0x10p-10").convertToDouble()); 929 930 EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble(), "0x1.1p0").convertToDouble()); 931 EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble()); 932 933 EXPECT_EQ(convertToDoubleFromString("0x1p-150"), 934 convertToDoubleFromString("+0x800000000000000001.p-221")); 935 EXPECT_EQ(2251799813685248.5, 936 convertToDoubleFromString("0x80000000000004000000.010p-28")); 937 } 938 939 TEST(APFloatTest, toString) { 940 ASSERT_EQ("10", convertToString(10.0, 6, 3)); 941 ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0)); 942 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2)); 943 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2)); 944 ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1)); 945 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2)); 946 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2)); 947 ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1)); 948 ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3)); 949 ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3)); 950 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1)); 951 ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0)); 952 ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0)); 953 ASSERT_EQ("10", convertToString(10.0, 6, 3, false)); 954 ASSERT_EQ("1.000000e+01", convertToString(10.0, 6, 0, false)); 955 ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2, false)); 956 ASSERT_EQ("1.0100e+04", convertToString(1.01E+4, 4, 2, false)); 957 ASSERT_EQ("1.01000e+04", convertToString(1.01E+4, 5, 1, false)); 958 ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2, false)); 959 ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2, false)); 960 ASSERT_EQ("1.01000e-02", convertToString(1.01E-2, 5, 1, false)); 961 ASSERT_EQ("0.78539816339744828", 962 convertToString(0.78539816339744830961, 0, 3, false)); 963 ASSERT_EQ("4.94065645841246540e-324", 964 convertToString(4.9406564584124654e-324, 0, 3, false)); 965 ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1, false)); 966 ASSERT_EQ("8.73183400000000010e+02", convertToString(873.1834, 0, 0, false)); 967 ASSERT_EQ("1.79769313486231570e+308", 968 convertToString(1.7976931348623157E+308, 0, 0, false)); 969 } 970 971 TEST(APFloatTest, toInteger) { 972 bool isExact = false; 973 APSInt result(5, /*isUnsigned=*/true); 974 975 EXPECT_EQ(APFloat::opOK, 976 APFloat(APFloat::IEEEdouble(), "10") 977 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 978 EXPECT_TRUE(isExact); 979 EXPECT_EQ(APSInt(APInt(5, 10), true), result); 980 981 EXPECT_EQ(APFloat::opInvalidOp, 982 APFloat(APFloat::IEEEdouble(), "-10") 983 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 984 EXPECT_FALSE(isExact); 985 EXPECT_EQ(APSInt::getMinValue(5, true), result); 986 987 EXPECT_EQ(APFloat::opInvalidOp, 988 APFloat(APFloat::IEEEdouble(), "32") 989 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 990 EXPECT_FALSE(isExact); 991 EXPECT_EQ(APSInt::getMaxValue(5, true), result); 992 993 EXPECT_EQ(APFloat::opInexact, 994 APFloat(APFloat::IEEEdouble(), "7.9") 995 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 996 EXPECT_FALSE(isExact); 997 EXPECT_EQ(APSInt(APInt(5, 7), true), result); 998 999 result.setIsUnsigned(false); 1000 EXPECT_EQ(APFloat::opOK, 1001 APFloat(APFloat::IEEEdouble(), "-10") 1002 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1003 EXPECT_TRUE(isExact); 1004 EXPECT_EQ(APSInt(APInt(5, -10, true), false), result); 1005 1006 EXPECT_EQ(APFloat::opInvalidOp, 1007 APFloat(APFloat::IEEEdouble(), "-17") 1008 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1009 EXPECT_FALSE(isExact); 1010 EXPECT_EQ(APSInt::getMinValue(5, false), result); 1011 1012 EXPECT_EQ(APFloat::opInvalidOp, 1013 APFloat(APFloat::IEEEdouble(), "16") 1014 .convertToInteger(result, APFloat::rmTowardZero, &isExact)); 1015 EXPECT_FALSE(isExact); 1016 EXPECT_EQ(APSInt::getMaxValue(5, false), result); 1017 } 1018 1019 static APInt nanbits(const fltSemantics &Sem, 1020 bool SNaN, bool Negative, uint64_t fill) { 1021 APInt apfill(64, fill); 1022 if (SNaN) 1023 return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt(); 1024 else 1025 return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt(); 1026 } 1027 1028 TEST(APFloatTest, makeNaN) { 1029 ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle(), false, false, 0)); 1030 ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle(), false, true, 0)); 1031 ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle(), false, false, 0xae72)); 1032 ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle(), false, false, 0xffffae72)); 1033 ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle(), true, false, 0)); 1034 ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle(), true, true, 0)); 1035 ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle(), true, false, 0xae72)); 1036 ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle(), true, false, 0xffffae72)); 1037 1038 ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, false, 0)); 1039 ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, true, 0)); 1040 ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xae72)); 1041 ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL)); 1042 ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, false, 0)); 1043 ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, true, 0)); 1044 ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xae72)); 1045 ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL)); 1046 } 1047 1048 #ifdef GTEST_HAS_DEATH_TEST 1049 #ifndef NDEBUG 1050 TEST(APFloatTest, SemanticsDeath) { 1051 EXPECT_DEATH(APFloat(APFloat::IEEEsingle(), 0.0f).convertToDouble(), "Float semantics are not IEEEdouble"); 1052 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), 0.0 ).convertToFloat(), "Float semantics are not IEEEsingle"); 1053 } 1054 1055 TEST(APFloatTest, StringDecimalDeath) { 1056 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ""), "Invalid string length"); 1057 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+"), "String has no digits"); 1058 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-"), "String has no digits"); 1059 1060 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("\0", 1)), "Invalid character in significand"); 1061 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1\0", 2)), "Invalid character in significand"); 1062 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1" "\0" "2", 3)), "Invalid character in significand"); 1063 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1" "\0" "2e1", 5)), "Invalid character in significand"); 1064 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e\0", 3)), "Invalid character in exponent"); 1065 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e1\0", 4)), "Invalid character in exponent"); 1066 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e1" "\0" "2", 5)), "Invalid character in exponent"); 1067 1068 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0f"), "Invalid character in significand"); 1069 1070 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".."), "String contains multiple dots"); 1071 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "..0"), "String contains multiple dots"); 1072 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0.0"), "String contains multiple dots"); 1073 } 1074 1075 TEST(APFloatTest, StringDecimalSignificandDeath) { 1076 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "."), "Significand has no digits"); 1077 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+."), "Significand has no digits"); 1078 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-."), "Significand has no digits"); 1079 1080 1081 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "e"), "Significand has no digits"); 1082 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+e"), "Significand has no digits"); 1083 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-e"), "Significand has no digits"); 1084 1085 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "e1"), "Significand has no digits"); 1086 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+e1"), "Significand has no digits"); 1087 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-e1"), "Significand has no digits"); 1088 1089 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".e1"), "Significand has no digits"); 1090 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e1"), "Significand has no digits"); 1091 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e1"), "Significand has no digits"); 1092 1093 1094 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".e"), "Significand has no digits"); 1095 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e"), "Significand has no digits"); 1096 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e"), "Significand has no digits"); 1097 } 1098 1099 TEST(APFloatTest, StringDecimalExponentDeath) { 1100 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e"), "Exponent has no digits"); 1101 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1e"), "Exponent has no digits"); 1102 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1e"), "Exponent has no digits"); 1103 1104 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.e"), "Exponent has no digits"); 1105 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1.e"), "Exponent has no digits"); 1106 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1.e"), "Exponent has no digits"); 1107 1108 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e"), "Exponent has no digits"); 1109 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.1e"), "Exponent has no digits"); 1110 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.1e"), "Exponent has no digits"); 1111 1112 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.1e"), "Exponent has no digits"); 1113 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+1.1e"), "Exponent has no digits"); 1114 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-1.1e"), "Exponent has no digits"); 1115 1116 1117 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e+"), "Exponent has no digits"); 1118 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e-"), "Exponent has no digits"); 1119 1120 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e"), "Exponent has no digits"); 1121 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e+"), "Exponent has no digits"); 1122 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e-"), "Exponent has no digits"); 1123 1124 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e"), "Exponent has no digits"); 1125 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e+"), "Exponent has no digits"); 1126 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e-"), "Exponent has no digits"); 1127 } 1128 1129 TEST(APFloatTest, StringHexadecimalDeath) { 1130 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x"), "Invalid string"); 1131 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x"), "Invalid string"); 1132 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x"), "Invalid string"); 1133 1134 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x0"), "Hex strings require an exponent"); 1135 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0"), "Hex strings require an exponent"); 1136 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0"), "Hex strings require an exponent"); 1137 1138 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x0."), "Hex strings require an exponent"); 1139 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0."), "Hex strings require an exponent"); 1140 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0."), "Hex strings require an exponent"); 1141 1142 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.0"), "Hex strings require an exponent"); 1143 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.0"), "Hex strings require an exponent"); 1144 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.0"), "Hex strings require an exponent"); 1145 1146 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x0.0"), "Hex strings require an exponent"); 1147 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0.0"), "Hex strings require an exponent"); 1148 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0.0"), "Hex strings require an exponent"); 1149 1150 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x\0", 3)), "Invalid character in significand"); 1151 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1\0", 4)), "Invalid character in significand"); 1152 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1" "\0" "2", 5)), "Invalid character in significand"); 1153 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1" "\0" "2p1", 7)), "Invalid character in significand"); 1154 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p\0", 5)), "Invalid character in exponent"); 1155 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p1\0", 6)), "Invalid character in exponent"); 1156 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p1" "\0" "2", 7)), "Invalid character in exponent"); 1157 1158 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p0f"), "Invalid character in exponent"); 1159 1160 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x..p1"), "String contains multiple dots"); 1161 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x..0p1"), "String contains multiple dots"); 1162 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.0.0p1"), "String contains multiple dots"); 1163 } 1164 1165 TEST(APFloatTest, StringHexadecimalSignificandDeath) { 1166 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x."), "Significand has no digits"); 1167 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x."), "Significand has no digits"); 1168 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x."), "Significand has no digits"); 1169 1170 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0xp"), "Significand has no digits"); 1171 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp"), "Significand has no digits"); 1172 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp"), "Significand has no digits"); 1173 1174 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0xp+"), "Significand has no digits"); 1175 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp+"), "Significand has no digits"); 1176 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp+"), "Significand has no digits"); 1177 1178 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0xp-"), "Significand has no digits"); 1179 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp-"), "Significand has no digits"); 1180 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp-"), "Significand has no digits"); 1181 1182 1183 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.p"), "Significand has no digits"); 1184 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p"), "Significand has no digits"); 1185 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p"), "Significand has no digits"); 1186 1187 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.p+"), "Significand has no digits"); 1188 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p+"), "Significand has no digits"); 1189 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p+"), "Significand has no digits"); 1190 1191 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.p-"), "Significand has no digits"); 1192 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p-"), "Significand has no digits"); 1193 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p-"), "Significand has no digits"); 1194 } 1195 1196 TEST(APFloatTest, StringHexadecimalExponentDeath) { 1197 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p"), "Exponent has no digits"); 1198 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p"), "Exponent has no digits"); 1199 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p"), "Exponent has no digits"); 1200 1201 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p+"), "Exponent has no digits"); 1202 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p+"), "Exponent has no digits"); 1203 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p+"), "Exponent has no digits"); 1204 1205 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p-"), "Exponent has no digits"); 1206 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p-"), "Exponent has no digits"); 1207 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p-"), "Exponent has no digits"); 1208 1209 1210 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.p"), "Exponent has no digits"); 1211 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p"), "Exponent has no digits"); 1212 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p"), "Exponent has no digits"); 1213 1214 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.p+"), "Exponent has no digits"); 1215 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p+"), "Exponent has no digits"); 1216 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p+"), "Exponent has no digits"); 1217 1218 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.p-"), "Exponent has no digits"); 1219 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p-"), "Exponent has no digits"); 1220 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p-"), "Exponent has no digits"); 1221 1222 1223 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.1p"), "Exponent has no digits"); 1224 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p"), "Exponent has no digits"); 1225 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p"), "Exponent has no digits"); 1226 1227 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.1p+"), "Exponent has no digits"); 1228 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p+"), "Exponent has no digits"); 1229 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p+"), "Exponent has no digits"); 1230 1231 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x.1p-"), "Exponent has no digits"); 1232 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p-"), "Exponent has no digits"); 1233 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p-"), "Exponent has no digits"); 1234 1235 1236 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.1p"), "Exponent has no digits"); 1237 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p"), "Exponent has no digits"); 1238 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p"), "Exponent has no digits"); 1239 1240 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.1p+"), "Exponent has no digits"); 1241 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p+"), "Exponent has no digits"); 1242 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p+"), "Exponent has no digits"); 1243 1244 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.1p-"), "Exponent has no digits"); 1245 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p-"), "Exponent has no digits"); 1246 EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p-"), "Exponent has no digits"); 1247 } 1248 #endif 1249 #endif 1250 1251 TEST(APFloatTest, exactInverse) { 1252 APFloat inv(0.0f); 1253 1254 // Trivial operation. 1255 EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv)); 1256 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5))); 1257 EXPECT_TRUE(APFloat(2.0f).getExactInverse(&inv)); 1258 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5f))); 1259 EXPECT_TRUE(APFloat(APFloat::IEEEquad(), "2.0").getExactInverse(&inv)); 1260 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::IEEEquad(), "0.5"))); 1261 EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble(), "2.0").getExactInverse(&inv)); 1262 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble(), "0.5"))); 1263 EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended(), "2.0").getExactInverse(&inv)); 1264 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended(), "0.5"))); 1265 1266 // FLT_MIN 1267 EXPECT_TRUE(APFloat(1.17549435e-38f).getExactInverse(&inv)); 1268 EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(8.5070592e+37f))); 1269 1270 // Large float, inverse is a denormal. 1271 EXPECT_FALSE(APFloat(1.7014118e38f).getExactInverse(nullptr)); 1272 // Zero 1273 EXPECT_FALSE(APFloat(0.0).getExactInverse(nullptr)); 1274 // Denormalized float 1275 EXPECT_FALSE(APFloat(1.40129846e-45f).getExactInverse(nullptr)); 1276 } 1277 1278 TEST(APFloatTest, roundToIntegral) { 1279 APFloat T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble())), P(0.0); 1280 1281 P = T; 1282 P.roundToIntegral(APFloat::rmTowardZero); 1283 EXPECT_EQ(-0.0, P.convertToDouble()); 1284 P = T; 1285 P.roundToIntegral(APFloat::rmTowardNegative); 1286 EXPECT_EQ(-1.0, P.convertToDouble()); 1287 P = T; 1288 P.roundToIntegral(APFloat::rmTowardPositive); 1289 EXPECT_EQ(-0.0, P.convertToDouble()); 1290 P = T; 1291 P.roundToIntegral(APFloat::rmNearestTiesToEven); 1292 EXPECT_EQ(-0.0, P.convertToDouble()); 1293 1294 P = S; 1295 P.roundToIntegral(APFloat::rmTowardZero); 1296 EXPECT_EQ(3.0, P.convertToDouble()); 1297 P = S; 1298 P.roundToIntegral(APFloat::rmTowardNegative); 1299 EXPECT_EQ(3.0, P.convertToDouble()); 1300 P = S; 1301 P.roundToIntegral(APFloat::rmTowardPositive); 1302 EXPECT_EQ(4.0, P.convertToDouble()); 1303 P = S; 1304 P.roundToIntegral(APFloat::rmNearestTiesToEven); 1305 EXPECT_EQ(3.0, P.convertToDouble()); 1306 1307 P = R; 1308 P.roundToIntegral(APFloat::rmTowardZero); 1309 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1310 P = R; 1311 P.roundToIntegral(APFloat::rmTowardNegative); 1312 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1313 P = R; 1314 P.roundToIntegral(APFloat::rmTowardPositive); 1315 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1316 P = R; 1317 P.roundToIntegral(APFloat::rmNearestTiesToEven); 1318 EXPECT_EQ(R.convertToDouble(), P.convertToDouble()); 1319 1320 P = APFloat::getZero(APFloat::IEEEdouble()); 1321 P.roundToIntegral(APFloat::rmTowardZero); 1322 EXPECT_EQ(0.0, P.convertToDouble()); 1323 P = APFloat::getZero(APFloat::IEEEdouble(), true); 1324 P.roundToIntegral(APFloat::rmTowardZero); 1325 EXPECT_EQ(-0.0, P.convertToDouble()); 1326 P = APFloat::getNaN(APFloat::IEEEdouble()); 1327 P.roundToIntegral(APFloat::rmTowardZero); 1328 EXPECT_TRUE(std::isnan(P.convertToDouble())); 1329 P = APFloat::getInf(APFloat::IEEEdouble()); 1330 P.roundToIntegral(APFloat::rmTowardZero); 1331 EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() > 0.0); 1332 P = APFloat::getInf(APFloat::IEEEdouble(), true); 1333 P.roundToIntegral(APFloat::rmTowardZero); 1334 EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() < 0.0); 1335 } 1336 1337 TEST(APFloatTest, isInteger) { 1338 APFloat T(-0.0); 1339 EXPECT_TRUE(T.isInteger()); 1340 T = APFloat(3.14159); 1341 EXPECT_FALSE(T.isInteger()); 1342 T = APFloat::getNaN(APFloat::IEEEdouble()); 1343 EXPECT_FALSE(T.isInteger()); 1344 T = APFloat::getInf(APFloat::IEEEdouble()); 1345 EXPECT_FALSE(T.isInteger()); 1346 T = APFloat::getInf(APFloat::IEEEdouble(), true); 1347 EXPECT_FALSE(T.isInteger()); 1348 T = APFloat::getLargest(APFloat::IEEEdouble()); 1349 EXPECT_TRUE(T.isInteger()); 1350 } 1351 1352 TEST(DoubleAPFloatTest, isInteger) { 1353 APFloat F1(-0.0); 1354 APFloat F2(-0.0); 1355 llvm::detail::DoubleAPFloat T(APFloat::PPCDoubleDouble(), std::move(F1), 1356 std::move(F2)); 1357 EXPECT_TRUE(T.isInteger()); 1358 APFloat F3(3.14159); 1359 APFloat F4(-0.0); 1360 llvm::detail::DoubleAPFloat T2(APFloat::PPCDoubleDouble(), std::move(F3), 1361 std::move(F4)); 1362 EXPECT_FALSE(T2.isInteger()); 1363 APFloat F5(-0.0); 1364 APFloat F6(3.14159); 1365 llvm::detail::DoubleAPFloat T3(APFloat::PPCDoubleDouble(), std::move(F5), 1366 std::move(F6)); 1367 EXPECT_FALSE(T3.isInteger()); 1368 } 1369 1370 TEST(APFloatTest, getLargest) { 1371 EXPECT_EQ(3.402823466e+38f, APFloat::getLargest(APFloat::IEEEsingle()).convertToFloat()); 1372 EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble()).convertToDouble()); 1373 } 1374 1375 TEST(APFloatTest, getSmallest) { 1376 APFloat test = APFloat::getSmallest(APFloat::IEEEsingle(), false); 1377 APFloat expected = APFloat(APFloat::IEEEsingle(), "0x0.000002p-126"); 1378 EXPECT_FALSE(test.isNegative()); 1379 EXPECT_TRUE(test.isFiniteNonZero()); 1380 EXPECT_TRUE(test.isDenormal()); 1381 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1382 1383 test = APFloat::getSmallest(APFloat::IEEEsingle(), true); 1384 expected = APFloat(APFloat::IEEEsingle(), "-0x0.000002p-126"); 1385 EXPECT_TRUE(test.isNegative()); 1386 EXPECT_TRUE(test.isFiniteNonZero()); 1387 EXPECT_TRUE(test.isDenormal()); 1388 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1389 1390 test = APFloat::getSmallest(APFloat::IEEEquad(), false); 1391 expected = APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382"); 1392 EXPECT_FALSE(test.isNegative()); 1393 EXPECT_TRUE(test.isFiniteNonZero()); 1394 EXPECT_TRUE(test.isDenormal()); 1395 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1396 1397 test = APFloat::getSmallest(APFloat::IEEEquad(), true); 1398 expected = APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382"); 1399 EXPECT_TRUE(test.isNegative()); 1400 EXPECT_TRUE(test.isFiniteNonZero()); 1401 EXPECT_TRUE(test.isDenormal()); 1402 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1403 } 1404 1405 TEST(APFloatTest, getSmallestNormalized) { 1406 APFloat test = APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 1407 APFloat expected = APFloat(APFloat::IEEEsingle(), "0x1p-126"); 1408 EXPECT_FALSE(test.isNegative()); 1409 EXPECT_TRUE(test.isFiniteNonZero()); 1410 EXPECT_FALSE(test.isDenormal()); 1411 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1412 1413 test = APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 1414 expected = APFloat(APFloat::IEEEsingle(), "-0x1p-126"); 1415 EXPECT_TRUE(test.isNegative()); 1416 EXPECT_TRUE(test.isFiniteNonZero()); 1417 EXPECT_FALSE(test.isDenormal()); 1418 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1419 1420 test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), false); 1421 expected = APFloat(APFloat::IEEEquad(), "0x1p-16382"); 1422 EXPECT_FALSE(test.isNegative()); 1423 EXPECT_TRUE(test.isFiniteNonZero()); 1424 EXPECT_FALSE(test.isDenormal()); 1425 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1426 1427 test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), true); 1428 expected = APFloat(APFloat::IEEEquad(), "-0x1p-16382"); 1429 EXPECT_TRUE(test.isNegative()); 1430 EXPECT_TRUE(test.isFiniteNonZero()); 1431 EXPECT_FALSE(test.isDenormal()); 1432 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1433 } 1434 1435 TEST(APFloatTest, getZero) { 1436 struct { 1437 const fltSemantics *semantics; 1438 const bool sign; 1439 const unsigned long long bitPattern[2]; 1440 const unsigned bitPatternLength; 1441 } const GetZeroTest[] = { 1442 { &APFloat::IEEEhalf(), false, {0, 0}, 1}, 1443 { &APFloat::IEEEhalf(), true, {0x8000ULL, 0}, 1}, 1444 { &APFloat::IEEEsingle(), false, {0, 0}, 1}, 1445 { &APFloat::IEEEsingle(), true, {0x80000000ULL, 0}, 1}, 1446 { &APFloat::IEEEdouble(), false, {0, 0}, 1}, 1447 { &APFloat::IEEEdouble(), true, {0x8000000000000000ULL, 0}, 1}, 1448 { &APFloat::IEEEquad(), false, {0, 0}, 2}, 1449 { &APFloat::IEEEquad(), true, {0, 0x8000000000000000ULL}, 2}, 1450 { &APFloat::PPCDoubleDouble(), false, {0, 0}, 2}, 1451 { &APFloat::PPCDoubleDouble(), true, {0x8000000000000000ULL, 0}, 2}, 1452 { &APFloat::x87DoubleExtended(), false, {0, 0}, 2}, 1453 { &APFloat::x87DoubleExtended(), true, {0, 0x8000ULL}, 2}, 1454 }; 1455 const unsigned NumGetZeroTests = 12; 1456 for (unsigned i = 0; i < NumGetZeroTests; ++i) { 1457 APFloat test = APFloat::getZero(*GetZeroTest[i].semantics, 1458 GetZeroTest[i].sign); 1459 const char *pattern = GetZeroTest[i].sign? "-0x0p+0" : "0x0p+0"; 1460 APFloat expected = APFloat(*GetZeroTest[i].semantics, 1461 pattern); 1462 EXPECT_TRUE(test.isZero()); 1463 EXPECT_TRUE(GetZeroTest[i].sign? test.isNegative() : !test.isNegative()); 1464 EXPECT_TRUE(test.bitwiseIsEqual(expected)); 1465 for (unsigned j = 0, je = GetZeroTest[i].bitPatternLength; j < je; ++j) { 1466 EXPECT_EQ(GetZeroTest[i].bitPattern[j], 1467 test.bitcastToAPInt().getRawData()[j]); 1468 } 1469 } 1470 } 1471 1472 TEST(APFloatTest, copySign) { 1473 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual( 1474 APFloat::copySign(APFloat(42.0), APFloat(-1.0)))); 1475 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual( 1476 APFloat::copySign(APFloat(-42.0), APFloat(1.0)))); 1477 EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual( 1478 APFloat::copySign(APFloat(-42.0), APFloat(-1.0)))); 1479 EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual( 1480 APFloat::copySign(APFloat(42.0), APFloat(1.0)))); 1481 } 1482 1483 TEST(APFloatTest, convert) { 1484 bool losesInfo; 1485 APFloat test(APFloat::IEEEdouble(), "1.0"); 1486 test.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &losesInfo); 1487 EXPECT_EQ(1.0f, test.convertToFloat()); 1488 EXPECT_FALSE(losesInfo); 1489 1490 test = APFloat(APFloat::x87DoubleExtended(), "0x1p-53"); 1491 test.add(APFloat(APFloat::x87DoubleExtended(), "1.0"), APFloat::rmNearestTiesToEven); 1492 test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo); 1493 EXPECT_EQ(1.0, test.convertToDouble()); 1494 EXPECT_TRUE(losesInfo); 1495 1496 test = APFloat(APFloat::IEEEquad(), "0x1p-53"); 1497 test.add(APFloat(APFloat::IEEEquad(), "1.0"), APFloat::rmNearestTiesToEven); 1498 test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo); 1499 EXPECT_EQ(1.0, test.convertToDouble()); 1500 EXPECT_TRUE(losesInfo); 1501 1502 test = APFloat(APFloat::x87DoubleExtended(), "0xf.fffffffp+28"); 1503 test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo); 1504 EXPECT_EQ(4294967295.0, test.convertToDouble()); 1505 EXPECT_FALSE(losesInfo); 1506 1507 test = APFloat::getSNaN(APFloat::IEEEsingle()); 1508 APFloat X87SNaN = APFloat::getSNaN(APFloat::x87DoubleExtended()); 1509 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1510 &losesInfo); 1511 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN)); 1512 EXPECT_FALSE(losesInfo); 1513 1514 test = APFloat::getQNaN(APFloat::IEEEsingle()); 1515 APFloat X87QNaN = APFloat::getQNaN(APFloat::x87DoubleExtended()); 1516 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1517 &losesInfo); 1518 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN)); 1519 EXPECT_FALSE(losesInfo); 1520 1521 test = APFloat::getSNaN(APFloat::x87DoubleExtended()); 1522 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1523 &losesInfo); 1524 EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN)); 1525 EXPECT_FALSE(losesInfo); 1526 1527 test = APFloat::getQNaN(APFloat::x87DoubleExtended()); 1528 test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven, 1529 &losesInfo); 1530 EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN)); 1531 EXPECT_FALSE(losesInfo); 1532 } 1533 1534 TEST(APFloatTest, PPCDoubleDouble) { 1535 APFloat test(APFloat::PPCDoubleDouble(), "1.0"); 1536 EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]); 1537 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]); 1538 1539 // LDBL_MAX 1540 test = APFloat(APFloat::PPCDoubleDouble(), "1.79769313486231580793728971405301e+308"); 1541 EXPECT_EQ(0x7fefffffffffffffull, test.bitcastToAPInt().getRawData()[0]); 1542 EXPECT_EQ(0x7c8ffffffffffffeull, test.bitcastToAPInt().getRawData()[1]); 1543 1544 // LDBL_MIN 1545 test = APFloat(APFloat::PPCDoubleDouble(), "2.00416836000897277799610805135016e-292"); 1546 EXPECT_EQ(0x0360000000000000ull, test.bitcastToAPInt().getRawData()[0]); 1547 EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]); 1548 1549 // PR30869 1550 { 1551 auto Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") + 1552 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1553 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1554 1555 Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") - 1556 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1557 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1558 1559 Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") * 1560 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1561 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1562 1563 Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") / 1564 APFloat(APFloat::PPCDoubleDouble(), "1.0"); 1565 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1566 1567 int Exp; 1568 Result = frexp(APFloat(APFloat::PPCDoubleDouble(), "1.0"), Exp, 1569 APFloat::rmNearestTiesToEven); 1570 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1571 1572 Result = scalbn(APFloat(APFloat::PPCDoubleDouble(), "1.0"), 1, 1573 APFloat::rmNearestTiesToEven); 1574 EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics()); 1575 } 1576 } 1577 1578 TEST(APFloatTest, isNegative) { 1579 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1580 EXPECT_FALSE(t.isNegative()); 1581 t = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 1582 EXPECT_TRUE(t.isNegative()); 1583 1584 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNegative()); 1585 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle(), true).isNegative()); 1586 1587 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNegative()); 1588 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), true).isNegative()); 1589 1590 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNegative()); 1591 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), true).isNegative()); 1592 1593 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNegative()); 1594 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isNegative()); 1595 } 1596 1597 TEST(APFloatTest, isNormal) { 1598 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1599 EXPECT_TRUE(t.isNormal()); 1600 1601 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNormal()); 1602 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNormal()); 1603 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNormal()); 1604 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNormal()); 1605 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNormal()); 1606 } 1607 1608 TEST(APFloatTest, isFinite) { 1609 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1610 EXPECT_TRUE(t.isFinite()); 1611 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFinite()); 1612 EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), false).isFinite()); 1613 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFinite()); 1614 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFinite()); 1615 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFinite()); 1616 } 1617 1618 TEST(APFloatTest, isInfinity) { 1619 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1620 EXPECT_FALSE(t.isInfinity()); 1621 EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle(), false).isInfinity()); 1622 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isInfinity()); 1623 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isInfinity()); 1624 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isInfinity()); 1625 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isInfinity()); 1626 } 1627 1628 TEST(APFloatTest, isNaN) { 1629 APFloat t(APFloat::IEEEsingle(), "0x1p+0"); 1630 EXPECT_FALSE(t.isNaN()); 1631 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNaN()); 1632 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNaN()); 1633 EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNaN()); 1634 EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNaN()); 1635 EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNaN()); 1636 } 1637 1638 TEST(APFloatTest, isFiniteNonZero) { 1639 // Test positive/negative normal value. 1640 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p+0").isFiniteNonZero()); 1641 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p+0").isFiniteNonZero()); 1642 1643 // Test positive/negative denormal value. 1644 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFiniteNonZero()); 1645 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").isFiniteNonZero()); 1646 1647 // Test +/- Infinity. 1648 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1649 EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1650 1651 // Test +/- Zero. 1652 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1653 EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1654 1655 // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in 1656 // this instance. 1657 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1658 EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1659 1660 // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in 1661 // this instance. 1662 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFiniteNonZero()); 1663 EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isFiniteNonZero()); 1664 } 1665 1666 TEST(APFloatTest, add) { 1667 // Test Special Cases against each other and normal values. 1668 1669 // TODOS/NOTES: 1670 // 1. Since we perform only default exception handling all operations with 1671 // signaling NaNs should have a result that is a quiet NaN. Currently they 1672 // return sNaN. 1673 1674 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 1675 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 1676 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 1677 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 1678 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 1679 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 1680 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 1681 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 1682 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 1683 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 1684 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 1685 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 1686 APFloat PSmallestNormalized = 1687 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 1688 APFloat MSmallestNormalized = 1689 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 1690 1691 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 1692 1693 const unsigned NumTests = 169; 1694 struct { 1695 APFloat x; 1696 APFloat y; 1697 const char *result; 1698 int status; 1699 int category; 1700 } SpecialCaseTests[NumTests] = { 1701 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1702 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1703 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 1704 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 1705 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1706 #if 0 1707 // See Note 1. 1708 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1709 #endif 1710 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1711 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1712 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1713 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1714 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1715 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1716 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 1717 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 1718 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1719 { MInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1720 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1721 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1722 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1723 #if 0 1724 // See Note 1. 1725 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1726 #endif 1727 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1728 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1729 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1730 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1731 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1732 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1733 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1734 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1735 { PZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1736 { PZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1737 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1738 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1739 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1740 #if 0 1741 // See Note 1. 1742 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1743 #endif 1744 { PZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1745 { PZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1746 { PZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1747 { PZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1748 { PZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1749 { PZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1750 { PZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1751 { PZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1752 { MZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1753 { MZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1754 { MZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1755 { MZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 1756 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1757 #if 0 1758 // See Note 1. 1759 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1760 #endif 1761 { MZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1762 { MZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1763 { MZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1764 { MZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1765 { MZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1766 { MZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1767 { MZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1768 { MZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1769 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 1770 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 1771 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 1772 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 1773 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1774 #if 0 1775 // See Note 1. 1776 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1777 #endif 1778 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1779 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1780 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1781 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1782 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1783 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 1784 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 1785 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 1786 #if 0 1787 // See Note 1. 1788 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1789 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1790 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1791 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1792 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1793 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1794 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1795 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1796 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1797 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1798 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1799 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1800 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1801 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1802 #endif 1803 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1804 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1805 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1806 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1807 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1808 #if 0 1809 // See Note 1. 1810 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1811 #endif 1812 { PNormalValue, PNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal }, 1813 { PNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1814 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1815 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1816 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1817 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1818 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1819 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1820 { MNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1821 { MNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1822 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1823 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 1824 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1825 #if 0 1826 // See Note 1. 1827 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1828 #endif 1829 { MNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1830 { MNormalValue, MNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal }, 1831 { MNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1832 { MNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1833 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1834 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1835 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1836 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1837 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1838 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1839 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1840 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1841 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1842 #if 0 1843 // See Note 1. 1844 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1845 #endif 1846 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1847 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1848 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 1849 { PLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1850 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1851 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1852 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1853 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1854 { MLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1855 { MLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1856 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1857 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 1858 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1859 #if 0 1860 // See Note 1. 1861 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1862 #endif 1863 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1864 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1865 { MLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1866 { MLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 1867 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1868 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1869 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1870 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1871 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1872 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1873 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1874 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1875 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1876 #if 0 1877 // See Note 1. 1878 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1879 #endif 1880 { PSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1881 { PSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1882 { PSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1883 { PSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1884 { PSmallestValue, PSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal }, 1885 { PSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1886 { PSmallestValue, PSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1887 { PSmallestValue, MSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1888 { MSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1889 { MSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1890 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1891 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 1892 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1893 #if 0 1894 // See Note 1. 1895 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1896 #endif 1897 { MSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1898 { MSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1899 { MSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1900 { MSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1901 { MSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1902 { MSmallestValue, MSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal }, 1903 { MSmallestValue, PSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1904 { MSmallestValue, MSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1905 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1906 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1907 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1908 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1909 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1910 #if 0 1911 // See Note 1. 1912 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1913 #endif 1914 { PSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1915 { PSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1916 { PSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1917 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1918 { PSmallestNormalized, PSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1919 { PSmallestNormalized, MSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1920 { PSmallestNormalized, PSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal }, 1921 { PSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1922 { MSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1923 { MSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 1924 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1925 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 1926 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 1927 #if 0 1928 // See Note 1. 1929 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1930 #endif 1931 { MSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1932 { MSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 1933 { MSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1934 { MSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 1935 { MSmallestNormalized, PSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 1936 { MSmallestNormalized, MSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 1937 { MSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 1938 { MSmallestNormalized, MSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal } 1939 }; 1940 1941 for (size_t i = 0; i < NumTests; ++i) { 1942 APFloat x(SpecialCaseTests[i].x); 1943 APFloat y(SpecialCaseTests[i].y); 1944 APFloat::opStatus status = x.add(y, APFloat::rmNearestTiesToEven); 1945 1946 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 1947 1948 EXPECT_TRUE(result.bitwiseIsEqual(x)); 1949 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 1950 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 1951 } 1952 } 1953 1954 TEST(APFloatTest, subtract) { 1955 // Test Special Cases against each other and normal values. 1956 1957 // TODOS/NOTES: 1958 // 1. Since we perform only default exception handling all operations with 1959 // signaling NaNs should have a result that is a quiet NaN. Currently they 1960 // return sNaN. 1961 1962 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 1963 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 1964 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 1965 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 1966 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 1967 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 1968 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 1969 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 1970 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 1971 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 1972 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 1973 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 1974 APFloat PSmallestNormalized = 1975 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 1976 APFloat MSmallestNormalized = 1977 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 1978 1979 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 1980 1981 const unsigned NumTests = 169; 1982 struct { 1983 APFloat x; 1984 APFloat y; 1985 const char *result; 1986 int status; 1987 int category; 1988 } SpecialCaseTests[NumTests] = { 1989 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1990 { PInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 1991 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 1992 { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 1993 { PInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 1994 #if 0 1995 // See Note 1. 1996 { PInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 1997 #endif 1998 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 1999 { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2000 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2001 { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2002 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2003 { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2004 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2005 { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2006 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2007 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2008 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2009 { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2010 { MInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2011 #if 0 2012 // See Note 1. 2013 { MInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2014 #endif 2015 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2016 { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2017 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2018 { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2019 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2020 { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2021 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2022 { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2023 { PZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2024 { PZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2025 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2026 { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2027 { PZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2028 #if 0 2029 // See Note 1. 2030 { PZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2031 #endif 2032 { PZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2033 { PZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2034 { PZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2035 { PZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2036 { PZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2037 { PZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2038 { PZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2039 { PZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2040 { MZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2041 { MZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2042 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2043 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2044 { MZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2045 #if 0 2046 // See Note 1. 2047 { MZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2048 #endif 2049 { MZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2050 { MZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2051 { MZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2052 { MZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2053 { MZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2054 { MZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2055 { MZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2056 { MZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2057 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2058 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2059 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2060 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2061 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2062 #if 0 2063 // See Note 1. 2064 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2065 #endif 2066 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2067 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2068 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2069 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2070 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2071 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2072 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2073 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2074 #if 0 2075 // See Note 1. 2076 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2077 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2078 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2079 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2080 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2081 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2082 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2083 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2084 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2085 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2086 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2087 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2088 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2089 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2090 #endif 2091 { PNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2092 { PNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2093 { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2094 { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2095 { PNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2096 #if 0 2097 // See Note 1. 2098 { PNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2099 #endif 2100 { PNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2101 { PNormalValue, MNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal }, 2102 { PNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2103 { PNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2104 { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2105 { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2106 { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2107 { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2108 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2109 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2110 { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2111 { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2112 { MNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2113 #if 0 2114 // See Note 1. 2115 { MNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2116 #endif 2117 { MNormalValue, PNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal }, 2118 { MNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2119 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2120 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2121 { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2122 { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2123 { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2124 { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2125 { PLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2126 { PLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2127 { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2128 { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2129 { PLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2130 #if 0 2131 // See Note 1. 2132 { PLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2133 #endif 2134 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2135 { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2136 { PLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2137 { PLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2138 { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2139 { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2140 { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2141 { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2142 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2143 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2144 { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2145 { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2146 { MLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2147 #if 0 2148 // See Note 1. 2149 { MLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2150 #endif 2151 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2152 { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2153 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2154 { MLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2155 { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2156 { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2157 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2158 { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2159 { PSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2160 { PSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2161 { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2162 { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2163 { PSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2164 #if 0 2165 // See Note 1. 2166 { PSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2167 #endif 2168 { PSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2169 { PSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2170 { PSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2171 { PSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2172 { PSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2173 { PSmallestValue, MSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal }, 2174 { PSmallestValue, PSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2175 { PSmallestValue, MSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2176 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2177 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2178 { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2179 { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2180 { MSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2181 #if 0 2182 // See Note 1. 2183 { MSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2184 #endif 2185 { MSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2186 { MSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2187 { MSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2188 { MSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2189 { MSmallestValue, PSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal }, 2190 { MSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2191 { MSmallestValue, PSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2192 { MSmallestValue, MSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2193 { PSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2194 { PSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2195 { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2196 { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2197 { PSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2198 #if 0 2199 // See Note 1. 2200 { PSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2201 #endif 2202 { PSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2203 { PSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2204 { PSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2205 { PSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2206 { PSmallestNormalized, PSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2207 { PSmallestNormalized, MSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2208 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2209 { PSmallestNormalized, MSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal }, 2210 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2211 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2212 { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2213 { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2214 { MSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN }, 2215 #if 0 2216 // See Note 1. 2217 { MSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2218 #endif 2219 { MSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2220 { MSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal }, 2221 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2222 { MSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal }, 2223 { MSmallestNormalized, PSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal }, 2224 { MSmallestNormalized, MSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal }, 2225 { MSmallestNormalized, PSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal }, 2226 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero } 2227 }; 2228 2229 for (size_t i = 0; i < NumTests; ++i) { 2230 APFloat x(SpecialCaseTests[i].x); 2231 APFloat y(SpecialCaseTests[i].y); 2232 APFloat::opStatus status = x.subtract(y, APFloat::rmNearestTiesToEven); 2233 2234 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 2235 2236 EXPECT_TRUE(result.bitwiseIsEqual(x)); 2237 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 2238 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 2239 } 2240 } 2241 2242 TEST(APFloatTest, multiply) { 2243 // Test Special Cases against each other and normal values. 2244 2245 // TODOS/NOTES: 2246 // 1. Since we perform only default exception handling all operations with 2247 // signaling NaNs should have a result that is a quiet NaN. Currently they 2248 // return sNaN. 2249 2250 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2251 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2252 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2253 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2254 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2255 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2256 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2257 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 2258 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 2259 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 2260 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 2261 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 2262 APFloat PSmallestNormalized = 2263 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 2264 APFloat MSmallestNormalized = 2265 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 2266 2267 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 2268 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact; 2269 2270 const unsigned NumTests = 169; 2271 struct { 2272 APFloat x; 2273 APFloat y; 2274 const char *result; 2275 int status; 2276 int category; 2277 } SpecialCaseTests[NumTests] = { 2278 { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2279 { PInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2280 { PInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2281 { PInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2282 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2283 #if 0 2284 // See Note 1. 2285 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2286 #endif 2287 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2288 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2289 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2290 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2291 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2292 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2293 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2294 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2295 { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2296 { MInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2297 { MInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2298 { MInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2299 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2300 #if 0 2301 // See Note 1. 2302 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2303 #endif 2304 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2305 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2306 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2307 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2308 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2309 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2310 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2311 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2312 { PZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2313 { PZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2314 { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2315 { PZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2316 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2317 #if 0 2318 // See Note 1. 2319 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2320 #endif 2321 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2322 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2323 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2324 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2325 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2326 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2327 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2328 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2329 { MZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2330 { MZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2331 { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2332 { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2333 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2334 #if 0 2335 // See Note 1. 2336 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2337 #endif 2338 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2339 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2340 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2341 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2342 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2343 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2344 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2345 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2346 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2347 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2348 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2349 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2350 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2351 #if 0 2352 // See Note 1. 2353 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2354 #endif 2355 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2356 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2357 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2358 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2359 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2360 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2361 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2362 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2363 #if 0 2364 // See Note 1. 2365 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2366 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2367 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2368 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2369 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2370 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2371 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2372 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2373 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2374 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2375 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2376 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2377 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2378 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2379 #endif 2380 { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2381 { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2382 { PNormalValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2383 { PNormalValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2384 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2385 #if 0 2386 // See Note 1. 2387 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2388 #endif 2389 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2390 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2391 { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2392 { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2393 { PNormalValue, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2394 { PNormalValue, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2395 { PNormalValue, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2396 { PNormalValue, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2397 { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2398 { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2399 { MNormalValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2400 { MNormalValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2401 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2402 #if 0 2403 // See Note 1. 2404 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2405 #endif 2406 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2407 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2408 { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2409 { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2410 { MNormalValue, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2411 { MNormalValue, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2412 { MNormalValue, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2413 { MNormalValue, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2414 { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2415 { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2416 { PLargestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2417 { PLargestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2418 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2419 #if 0 2420 // See Note 1. 2421 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2422 #endif 2423 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2424 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2425 { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2426 { PLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2427 { PLargestValue, PSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2428 { PLargestValue, MSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2429 { PLargestValue, PSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2430 { PLargestValue, MSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2431 { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2432 { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2433 { MLargestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2434 { MLargestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2435 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2436 #if 0 2437 // See Note 1. 2438 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2439 #endif 2440 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2441 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2442 { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2443 { MLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2444 { MLargestValue, PSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2445 { MLargestValue, MSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2446 { MLargestValue, PSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2447 { MLargestValue, MSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2448 { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2449 { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2450 { PSmallestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2451 { PSmallestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2452 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2453 #if 0 2454 // See Note 1. 2455 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2456 #endif 2457 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2458 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2459 { PSmallestValue, PLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2460 { PSmallestValue, MLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2461 { PSmallestValue, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2462 { PSmallestValue, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2463 { PSmallestValue, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2464 { PSmallestValue, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2465 { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2466 { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2467 { MSmallestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2468 { MSmallestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2469 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2470 #if 0 2471 // See Note 1. 2472 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2473 #endif 2474 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2475 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2476 { MSmallestValue, PLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2477 { MSmallestValue, MLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal }, 2478 { MSmallestValue, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2479 { MSmallestValue, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2480 { MSmallestValue, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2481 { MSmallestValue, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2482 { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2483 { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2484 { PSmallestNormalized, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2485 { PSmallestNormalized, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2486 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2487 #if 0 2488 // See Note 1. 2489 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2490 #endif 2491 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2492 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2493 { PSmallestNormalized, PLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2494 { PSmallestNormalized, MLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2495 { PSmallestNormalized, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2496 { PSmallestNormalized, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2497 { PSmallestNormalized, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2498 { PSmallestNormalized, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2499 { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2500 { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity }, 2501 { MSmallestNormalized, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2502 { MSmallestNormalized, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2503 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2504 #if 0 2505 // See Note 1. 2506 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2507 #endif 2508 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2509 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2510 { MSmallestNormalized, PLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2511 { MSmallestNormalized, MLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal }, 2512 { MSmallestNormalized, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2513 { MSmallestNormalized, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2514 { MSmallestNormalized, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2515 { MSmallestNormalized, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero } 2516 }; 2517 2518 for (size_t i = 0; i < NumTests; ++i) { 2519 APFloat x(SpecialCaseTests[i].x); 2520 APFloat y(SpecialCaseTests[i].y); 2521 APFloat::opStatus status = x.multiply(y, APFloat::rmNearestTiesToEven); 2522 2523 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 2524 2525 EXPECT_TRUE(result.bitwiseIsEqual(x)); 2526 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 2527 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 2528 } 2529 } 2530 2531 TEST(APFloatTest, divide) { 2532 // Test Special Cases against each other and normal values. 2533 2534 // TODOS/NOTES: 2535 // 1. Since we perform only default exception handling all operations with 2536 // signaling NaNs should have a result that is a quiet NaN. Currently they 2537 // return sNaN. 2538 2539 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2540 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2541 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2542 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2543 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2544 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2545 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2546 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 2547 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 2548 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 2549 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 2550 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 2551 APFloat PSmallestNormalized = 2552 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 2553 APFloat MSmallestNormalized = 2554 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 2555 2556 const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact; 2557 const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact; 2558 2559 const unsigned NumTests = 169; 2560 struct { 2561 APFloat x; 2562 APFloat y; 2563 const char *result; 2564 int status; 2565 int category; 2566 } SpecialCaseTests[NumTests] = { 2567 { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2568 { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2569 { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 2570 { PInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2571 { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2572 #if 0 2573 // See Note 1. 2574 { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2575 #endif 2576 { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2577 { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2578 { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2579 { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2580 { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2581 { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2582 { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2583 { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2584 { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2585 { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2586 { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2587 { MInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity }, 2588 { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2589 #if 0 2590 // See Note 1. 2591 { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2592 #endif 2593 { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2594 { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2595 { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2596 { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2597 { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2598 { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity }, 2599 { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity }, 2600 { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity }, 2601 { PZero, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2602 { PZero, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2603 { PZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2604 { PZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2605 { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2606 #if 0 2607 // See Note 1. 2608 { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2609 #endif 2610 { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2611 { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2612 { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2613 { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2614 { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2615 { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2616 { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2617 { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2618 { MZero, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2619 { MZero, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2620 { MZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2621 { MZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2622 { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2623 #if 0 2624 // See Note 1. 2625 { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2626 #endif 2627 { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2628 { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2629 { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2630 { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2631 { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2632 { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2633 { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2634 { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2635 { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2636 { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN }, 2637 { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2638 { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN }, 2639 { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2640 #if 0 2641 // See Note 1. 2642 { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2643 #endif 2644 { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2645 { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2646 { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2647 { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2648 { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2649 { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN }, 2650 { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2651 { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN }, 2652 #if 0 2653 // See Note 1. 2654 { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2655 { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2656 { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2657 { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2658 { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2659 { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2660 { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2661 { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2662 { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2663 { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2664 { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2665 { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2666 { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2667 { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2668 #endif 2669 { PNormalValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2670 { PNormalValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2671 { PNormalValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2672 { PNormalValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2673 { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2674 #if 0 2675 // See Note 1. 2676 { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2677 #endif 2678 { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2679 { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2680 { PNormalValue, PLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2681 { PNormalValue, MLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2682 { PNormalValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2683 { PNormalValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2684 { PNormalValue, PSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2685 { PNormalValue, MSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2686 { MNormalValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2687 { MNormalValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2688 { MNormalValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2689 { MNormalValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2690 { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2691 #if 0 2692 // See Note 1. 2693 { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2694 #endif 2695 { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2696 { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2697 { MNormalValue, PLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2698 { MNormalValue, MLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal }, 2699 { MNormalValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2700 { MNormalValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2701 { MNormalValue, PSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2702 { MNormalValue, MSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal }, 2703 { PLargestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2704 { PLargestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2705 { PLargestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2706 { PLargestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2707 { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2708 #if 0 2709 // See Note 1. 2710 { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2711 #endif 2712 { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2713 { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2714 { PLargestValue, PLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2715 { PLargestValue, MLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2716 { PLargestValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2717 { PLargestValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2718 { PLargestValue, PSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity }, 2719 { PLargestValue, MSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity }, 2720 { MLargestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2721 { MLargestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2722 { MLargestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2723 { MLargestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2724 { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2725 #if 0 2726 // See Note 1. 2727 { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2728 #endif 2729 { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2730 { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal }, 2731 { MLargestValue, PLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2732 { MLargestValue, MLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2733 { MLargestValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity }, 2734 { MLargestValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity }, 2735 { MLargestValue, PSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity }, 2736 { MLargestValue, MSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity }, 2737 { PSmallestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2738 { PSmallestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2739 { PSmallestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2740 { PSmallestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2741 { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2742 #if 0 2743 // See Note 1. 2744 { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2745 #endif 2746 { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2747 { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2748 { PSmallestValue, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2749 { PSmallestValue, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2750 { PSmallestValue, PSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2751 { PSmallestValue, MSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2752 { PSmallestValue, PSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2753 { PSmallestValue, MSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2754 { MSmallestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2755 { MSmallestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2756 { MSmallestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2757 { MSmallestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2758 { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2759 #if 0 2760 // See Note 1. 2761 { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2762 #endif 2763 { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2764 { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal }, 2765 { MSmallestValue, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2766 { MSmallestValue, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2767 { MSmallestValue, PSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2768 { MSmallestValue, MSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2769 { MSmallestValue, PSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2770 { MSmallestValue, MSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal }, 2771 { PSmallestNormalized, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2772 { PSmallestNormalized, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2773 { PSmallestNormalized, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2774 { PSmallestNormalized, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2775 { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2776 #if 0 2777 // See Note 1. 2778 { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2779 #endif 2780 { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2781 { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2782 { PSmallestNormalized, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2783 { PSmallestNormalized, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2784 { PSmallestNormalized, PSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2785 { PSmallestNormalized, MSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2786 { PSmallestNormalized, PSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2787 { PSmallestNormalized, MSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2788 { MSmallestNormalized, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero }, 2789 { MSmallestNormalized, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero }, 2790 { MSmallestNormalized, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2791 { MSmallestNormalized, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity }, 2792 { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN }, 2793 #if 0 2794 // See Note 1. 2795 { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN }, 2796 #endif 2797 { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2798 { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal }, 2799 { MSmallestNormalized, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero }, 2800 { MSmallestNormalized, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero }, 2801 { MSmallestNormalized, PSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2802 { MSmallestNormalized, MSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal }, 2803 { MSmallestNormalized, PSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2804 { MSmallestNormalized, MSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal }, 2805 }; 2806 2807 for (size_t i = 0; i < NumTests; ++i) { 2808 APFloat x(SpecialCaseTests[i].x); 2809 APFloat y(SpecialCaseTests[i].y); 2810 APFloat::opStatus status = x.divide(y, APFloat::rmNearestTiesToEven); 2811 2812 APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result); 2813 2814 EXPECT_TRUE(result.bitwiseIsEqual(x)); 2815 EXPECT_TRUE((int)status == SpecialCaseTests[i].status); 2816 EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category); 2817 } 2818 } 2819 2820 TEST(APFloatTest, operatorOverloads) { 2821 // This is mostly testing that these operator overloads compile. 2822 APFloat One = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2823 APFloat Two = APFloat(APFloat::IEEEsingle(), "0x2p+0"); 2824 EXPECT_TRUE(Two.bitwiseIsEqual(One + One)); 2825 EXPECT_TRUE(One.bitwiseIsEqual(Two - One)); 2826 EXPECT_TRUE(Two.bitwiseIsEqual(One * Two)); 2827 EXPECT_TRUE(One.bitwiseIsEqual(Two / Two)); 2828 } 2829 2830 TEST(APFloatTest, abs) { 2831 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2832 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2833 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2834 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2835 APFloat PQNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2836 APFloat MQNaN = APFloat::getNaN(APFloat::IEEEsingle(), true); 2837 APFloat PSNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2838 APFloat MSNaN = APFloat::getSNaN(APFloat::IEEEsingle(), true); 2839 APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0"); 2840 APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0"); 2841 APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false); 2842 APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true); 2843 APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false); 2844 APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true); 2845 APFloat PSmallestNormalized = 2846 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false); 2847 APFloat MSmallestNormalized = 2848 APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); 2849 2850 EXPECT_TRUE(PInf.bitwiseIsEqual(abs(PInf))); 2851 EXPECT_TRUE(PInf.bitwiseIsEqual(abs(MInf))); 2852 EXPECT_TRUE(PZero.bitwiseIsEqual(abs(PZero))); 2853 EXPECT_TRUE(PZero.bitwiseIsEqual(abs(MZero))); 2854 EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(PQNaN))); 2855 EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(MQNaN))); 2856 EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(PSNaN))); 2857 EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(MSNaN))); 2858 EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(PNormalValue))); 2859 EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(MNormalValue))); 2860 EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(PLargestValue))); 2861 EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(MLargestValue))); 2862 EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(PSmallestValue))); 2863 EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(MSmallestValue))); 2864 EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(PSmallestNormalized))); 2865 EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(MSmallestNormalized))); 2866 } 2867 2868 TEST(APFloatTest, neg) { 2869 APFloat One = APFloat(APFloat::IEEEsingle(), "1.0"); 2870 APFloat NegOne = APFloat(APFloat::IEEEsingle(), "-1.0"); 2871 APFloat Zero = APFloat::getZero(APFloat::IEEEsingle(), false); 2872 APFloat NegZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2873 APFloat Inf = APFloat::getInf(APFloat::IEEEsingle(), false); 2874 APFloat NegInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2875 APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2876 APFloat NegQNaN = APFloat::getNaN(APFloat::IEEEsingle(), true); 2877 2878 EXPECT_TRUE(NegOne.bitwiseIsEqual(neg(One))); 2879 EXPECT_TRUE(One.bitwiseIsEqual(neg(NegOne))); 2880 EXPECT_TRUE(NegZero.bitwiseIsEqual(neg(Zero))); 2881 EXPECT_TRUE(Zero.bitwiseIsEqual(neg(NegZero))); 2882 EXPECT_TRUE(NegInf.bitwiseIsEqual(neg(Inf))); 2883 EXPECT_TRUE(Inf.bitwiseIsEqual(neg(NegInf))); 2884 EXPECT_TRUE(NegInf.bitwiseIsEqual(neg(Inf))); 2885 EXPECT_TRUE(Inf.bitwiseIsEqual(neg(NegInf))); 2886 EXPECT_TRUE(NegQNaN.bitwiseIsEqual(neg(QNaN))); 2887 EXPECT_TRUE(QNaN.bitwiseIsEqual(neg(NegQNaN))); 2888 } 2889 2890 TEST(APFloatTest, ilogb) { 2891 EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), false))); 2892 EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), true))); 2893 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1024"))); 2894 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023"))); 2895 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023"))); 2896 EXPECT_EQ(-51, ilogb(APFloat(APFloat::IEEEdouble(), "0x1p-51"))); 2897 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1023"))); 2898 EXPECT_EQ(-2, ilogb(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1"))); 2899 EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1023"))); 2900 EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), false))); 2901 EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), true))); 2902 2903 2904 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+0"))); 2905 EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "-0x1p+0"))); 2906 EXPECT_EQ(42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+42"))); 2907 EXPECT_EQ(-42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p-42"))); 2908 2909 EXPECT_EQ(APFloat::IEK_Inf, 2910 ilogb(APFloat::getInf(APFloat::IEEEsingle(), false))); 2911 EXPECT_EQ(APFloat::IEK_Inf, 2912 ilogb(APFloat::getInf(APFloat::IEEEsingle(), true))); 2913 EXPECT_EQ(APFloat::IEK_Zero, 2914 ilogb(APFloat::getZero(APFloat::IEEEsingle(), false))); 2915 EXPECT_EQ(APFloat::IEK_Zero, 2916 ilogb(APFloat::getZero(APFloat::IEEEsingle(), true))); 2917 EXPECT_EQ(APFloat::IEK_NaN, 2918 ilogb(APFloat::getNaN(APFloat::IEEEsingle(), false))); 2919 EXPECT_EQ(APFloat::IEK_NaN, 2920 ilogb(APFloat::getSNaN(APFloat::IEEEsingle(), false))); 2921 2922 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), false))); 2923 EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), true))); 2924 2925 EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), false))); 2926 EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), true))); 2927 EXPECT_EQ(-126, 2928 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false))); 2929 EXPECT_EQ(-126, 2930 ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true))); 2931 } 2932 2933 TEST(APFloatTest, scalbn) { 2934 2935 const APFloat::roundingMode RM = APFloat::rmNearestTiesToEven; 2936 EXPECT_TRUE( 2937 APFloat(APFloat::IEEEsingle(), "0x1p+0") 2938 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 0, RM))); 2939 EXPECT_TRUE( 2940 APFloat(APFloat::IEEEsingle(), "0x1p+42") 2941 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 42, RM))); 2942 EXPECT_TRUE( 2943 APFloat(APFloat::IEEEsingle(), "0x1p-42") 2944 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), -42, RM))); 2945 2946 APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false); 2947 APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true); 2948 APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false); 2949 APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true); 2950 APFloat QPNaN = APFloat::getNaN(APFloat::IEEEsingle(), false); 2951 APFloat QMNaN = APFloat::getNaN(APFloat::IEEEsingle(), true); 2952 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false); 2953 2954 EXPECT_TRUE(PInf.bitwiseIsEqual(scalbn(PInf, 0, RM))); 2955 EXPECT_TRUE(MInf.bitwiseIsEqual(scalbn(MInf, 0, RM))); 2956 EXPECT_TRUE(PZero.bitwiseIsEqual(scalbn(PZero, 0, RM))); 2957 EXPECT_TRUE(MZero.bitwiseIsEqual(scalbn(MZero, 0, RM))); 2958 EXPECT_TRUE(QPNaN.bitwiseIsEqual(scalbn(QPNaN, 0, RM))); 2959 EXPECT_TRUE(QMNaN.bitwiseIsEqual(scalbn(QMNaN, 0, RM))); 2960 EXPECT_FALSE(scalbn(SNaN, 0, RM).isSignaling()); 2961 2962 APFloat ScalbnSNaN = scalbn(SNaN, 1, RM); 2963 EXPECT_TRUE(ScalbnSNaN.isNaN() && !ScalbnSNaN.isSignaling()); 2964 2965 // Make sure highest bit of payload is preserved. 2966 const APInt Payload(64, (UINT64_C(1) << 50) | 2967 (UINT64_C(1) << 49) | 2968 (UINT64_C(1234) << 32) | 2969 1); 2970 2971 APFloat SNaNWithPayload = APFloat::getSNaN(APFloat::IEEEdouble(), false, 2972 &Payload); 2973 APFloat QuietPayload = scalbn(SNaNWithPayload, 1, RM); 2974 EXPECT_TRUE(QuietPayload.isNaN() && !QuietPayload.isSignaling()); 2975 EXPECT_EQ(Payload, QuietPayload.bitcastToAPInt().getLoBits(51)); 2976 2977 EXPECT_TRUE(PInf.bitwiseIsEqual( 2978 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 128, RM))); 2979 EXPECT_TRUE(MInf.bitwiseIsEqual( 2980 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p+0"), 128, RM))); 2981 EXPECT_TRUE(PInf.bitwiseIsEqual( 2982 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+127"), 1, RM))); 2983 EXPECT_TRUE(PZero.bitwiseIsEqual( 2984 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-127"), -127, RM))); 2985 EXPECT_TRUE(MZero.bitwiseIsEqual( 2986 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -127, RM))); 2987 EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").bitwiseIsEqual( 2988 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -22, RM))); 2989 EXPECT_TRUE(PZero.bitwiseIsEqual( 2990 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-126"), -24, RM))); 2991 2992 2993 APFloat SmallestF64 = APFloat::getSmallest(APFloat::IEEEdouble(), false); 2994 APFloat NegSmallestF64 = APFloat::getSmallest(APFloat::IEEEdouble(), true); 2995 2996 APFloat LargestF64 = APFloat::getLargest(APFloat::IEEEdouble(), false); 2997 APFloat NegLargestF64 = APFloat::getLargest(APFloat::IEEEdouble(), true); 2998 2999 APFloat SmallestNormalizedF64 3000 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false); 3001 APFloat NegSmallestNormalizedF64 3002 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true); 3003 3004 APFloat LargestDenormalF64(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023"); 3005 APFloat NegLargestDenormalF64(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023"); 3006 3007 3008 EXPECT_TRUE(SmallestF64.bitwiseIsEqual( 3009 scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-1074"), 0, RM))); 3010 EXPECT_TRUE(NegSmallestF64.bitwiseIsEqual( 3011 scalbn(APFloat(APFloat::IEEEdouble(), "-0x1p-1074"), 0, RM))); 3012 3013 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023") 3014 .bitwiseIsEqual(scalbn(SmallestF64, 2097, RM))); 3015 3016 EXPECT_TRUE(scalbn(SmallestF64, -2097, RM).isPosZero()); 3017 EXPECT_TRUE(scalbn(SmallestF64, -2098, RM).isPosZero()); 3018 EXPECT_TRUE(scalbn(SmallestF64, -2099, RM).isPosZero()); 3019 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1022") 3020 .bitwiseIsEqual(scalbn(SmallestF64, 2096, RM))); 3021 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023") 3022 .bitwiseIsEqual(scalbn(SmallestF64, 2097, RM))); 3023 EXPECT_TRUE(scalbn(SmallestF64, 2098, RM).isInfinity()); 3024 EXPECT_TRUE(scalbn(SmallestF64, 2099, RM).isInfinity()); 3025 3026 // Test for integer overflows when adding to exponent. 3027 EXPECT_TRUE(scalbn(SmallestF64, -INT_MAX, RM).isPosZero()); 3028 EXPECT_TRUE(scalbn(LargestF64, INT_MAX, RM).isInfinity()); 3029 3030 EXPECT_TRUE(LargestDenormalF64 3031 .bitwiseIsEqual(scalbn(LargestDenormalF64, 0, RM))); 3032 EXPECT_TRUE(NegLargestDenormalF64 3033 .bitwiseIsEqual(scalbn(NegLargestDenormalF64, 0, RM))); 3034 3035 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1022") 3036 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1, RM))); 3037 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1021") 3038 .bitwiseIsEqual(scalbn(NegLargestDenormalF64, 2, RM))); 3039 3040 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1") 3041 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1024, RM))); 3042 EXPECT_TRUE(scalbn(LargestDenormalF64, -1023, RM).isPosZero()); 3043 EXPECT_TRUE(scalbn(LargestDenormalF64, -1024, RM).isPosZero()); 3044 EXPECT_TRUE(scalbn(LargestDenormalF64, -2048, RM).isPosZero()); 3045 EXPECT_TRUE(scalbn(LargestDenormalF64, 2047, RM).isInfinity()); 3046 EXPECT_TRUE(scalbn(LargestDenormalF64, 2098, RM).isInfinity()); 3047 EXPECT_TRUE(scalbn(LargestDenormalF64, 2099, RM).isInfinity()); 3048 3049 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-2") 3050 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1021, RM))); 3051 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1") 3052 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1022, RM))); 3053 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+0") 3054 .bitwiseIsEqual(scalbn(LargestDenormalF64, 1023, RM))); 3055 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1023") 3056 .bitwiseIsEqual(scalbn(LargestDenormalF64, 2046, RM))); 3057 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+974") 3058 .bitwiseIsEqual(scalbn(SmallestF64, 2048, RM))); 3059 3060 APFloat RandomDenormalF64(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51"); 3061 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-972") 3062 .bitwiseIsEqual(scalbn(RandomDenormalF64, -1023, RM))); 3063 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1") 3064 .bitwiseIsEqual(scalbn(RandomDenormalF64, -52, RM))); 3065 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-2") 3066 .bitwiseIsEqual(scalbn(RandomDenormalF64, -53, RM))); 3067 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+0") 3068 .bitwiseIsEqual(scalbn(RandomDenormalF64, -51, RM))); 3069 3070 EXPECT_TRUE(scalbn(RandomDenormalF64, -2097, RM).isPosZero()); 3071 EXPECT_TRUE(scalbn(RandomDenormalF64, -2090, RM).isPosZero()); 3072 3073 3074 EXPECT_TRUE( 3075 APFloat(APFloat::IEEEdouble(), "-0x1p-1073") 3076 .bitwiseIsEqual(scalbn(NegLargestF64, -2097, RM))); 3077 3078 EXPECT_TRUE( 3079 APFloat(APFloat::IEEEdouble(), "-0x1p-1024") 3080 .bitwiseIsEqual(scalbn(NegLargestF64, -2048, RM))); 3081 3082 EXPECT_TRUE( 3083 APFloat(APFloat::IEEEdouble(), "0x1p-1073") 3084 .bitwiseIsEqual(scalbn(LargestF64, -2097, RM))); 3085 3086 EXPECT_TRUE( 3087 APFloat(APFloat::IEEEdouble(), "0x1p-1074") 3088 .bitwiseIsEqual(scalbn(LargestF64, -2098, RM))); 3089 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1074") 3090 .bitwiseIsEqual(scalbn(NegLargestF64, -2098, RM))); 3091 EXPECT_TRUE(scalbn(NegLargestF64, -2099, RM).isNegZero()); 3092 EXPECT_TRUE(scalbn(LargestF64, 1, RM).isInfinity()); 3093 3094 3095 EXPECT_TRUE( 3096 APFloat(APFloat::IEEEdouble(), "0x1p+0") 3097 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p+52"), -52, RM))); 3098 3099 EXPECT_TRUE( 3100 APFloat(APFloat::IEEEdouble(), "0x1p-103") 3101 .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-51"), -52, RM))); 3102 } 3103 3104 TEST(APFloatTest, frexp) { 3105 const APFloat::roundingMode RM = APFloat::rmNearestTiesToEven; 3106 3107 APFloat PZero = APFloat::getZero(APFloat::IEEEdouble(), false); 3108 APFloat MZero = APFloat::getZero(APFloat::IEEEdouble(), true); 3109 APFloat One(1.0); 3110 APFloat MOne(-1.0); 3111 APFloat Two(2.0); 3112 APFloat MTwo(-2.0); 3113 3114 APFloat LargestDenormal(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023"); 3115 APFloat NegLargestDenormal(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023"); 3116 3117 APFloat Smallest = APFloat::getSmallest(APFloat::IEEEdouble(), false); 3118 APFloat NegSmallest = APFloat::getSmallest(APFloat::IEEEdouble(), true); 3119 3120 APFloat Largest = APFloat::getLargest(APFloat::IEEEdouble(), false); 3121 APFloat NegLargest = APFloat::getLargest(APFloat::IEEEdouble(), true); 3122 3123 APFloat PInf = APFloat::getInf(APFloat::IEEEdouble(), false); 3124 APFloat MInf = APFloat::getInf(APFloat::IEEEdouble(), true); 3125 3126 APFloat QPNaN = APFloat::getNaN(APFloat::IEEEdouble(), false); 3127 APFloat QMNaN = APFloat::getNaN(APFloat::IEEEdouble(), true); 3128 APFloat SNaN = APFloat::getSNaN(APFloat::IEEEdouble(), false); 3129 3130 // Make sure highest bit of payload is preserved. 3131 const APInt Payload(64, (UINT64_C(1) << 50) | 3132 (UINT64_C(1) << 49) | 3133 (UINT64_C(1234) << 32) | 3134 1); 3135 3136 APFloat SNaNWithPayload = APFloat::getSNaN(APFloat::IEEEdouble(), false, 3137 &Payload); 3138 3139 APFloat SmallestNormalized 3140 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false); 3141 APFloat NegSmallestNormalized 3142 = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true); 3143 3144 int Exp; 3145 APFloat Frac(APFloat::IEEEdouble()); 3146 3147 3148 Frac = frexp(PZero, Exp, RM); 3149 EXPECT_EQ(0, Exp); 3150 EXPECT_TRUE(Frac.isPosZero()); 3151 3152 Frac = frexp(MZero, Exp, RM); 3153 EXPECT_EQ(0, Exp); 3154 EXPECT_TRUE(Frac.isNegZero()); 3155 3156 3157 Frac = frexp(One, Exp, RM); 3158 EXPECT_EQ(1, Exp); 3159 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac)); 3160 3161 Frac = frexp(MOne, Exp, RM); 3162 EXPECT_EQ(1, Exp); 3163 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac)); 3164 3165 Frac = frexp(LargestDenormal, Exp, RM); 3166 EXPECT_EQ(-1022, Exp); 3167 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1").bitwiseIsEqual(Frac)); 3168 3169 Frac = frexp(NegLargestDenormal, Exp, RM); 3170 EXPECT_EQ(-1022, Exp); 3171 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1").bitwiseIsEqual(Frac)); 3172 3173 3174 Frac = frexp(Smallest, Exp, RM); 3175 EXPECT_EQ(-1073, Exp); 3176 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac)); 3177 3178 Frac = frexp(NegSmallest, Exp, RM); 3179 EXPECT_EQ(-1073, Exp); 3180 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac)); 3181 3182 3183 Frac = frexp(Largest, Exp, RM); 3184 EXPECT_EQ(1024, Exp); 3185 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffffffffffffp-1").bitwiseIsEqual(Frac)); 3186 3187 Frac = frexp(NegLargest, Exp, RM); 3188 EXPECT_EQ(1024, Exp); 3189 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.fffffffffffffp-1").bitwiseIsEqual(Frac)); 3190 3191 3192 Frac = frexp(PInf, Exp, RM); 3193 EXPECT_EQ(INT_MAX, Exp); 3194 EXPECT_TRUE(Frac.isInfinity() && !Frac.isNegative()); 3195 3196 Frac = frexp(MInf, Exp, RM); 3197 EXPECT_EQ(INT_MAX, Exp); 3198 EXPECT_TRUE(Frac.isInfinity() && Frac.isNegative()); 3199 3200 Frac = frexp(QPNaN, Exp, RM); 3201 EXPECT_EQ(INT_MIN, Exp); 3202 EXPECT_TRUE(Frac.isNaN()); 3203 3204 Frac = frexp(QMNaN, Exp, RM); 3205 EXPECT_EQ(INT_MIN, Exp); 3206 EXPECT_TRUE(Frac.isNaN()); 3207 3208 Frac = frexp(SNaN, Exp, RM); 3209 EXPECT_EQ(INT_MIN, Exp); 3210 EXPECT_TRUE(Frac.isNaN() && !Frac.isSignaling()); 3211 3212 Frac = frexp(SNaNWithPayload, Exp, RM); 3213 EXPECT_EQ(INT_MIN, Exp); 3214 EXPECT_TRUE(Frac.isNaN() && !Frac.isSignaling()); 3215 EXPECT_EQ(Payload, Frac.bitcastToAPInt().getLoBits(51)); 3216 3217 Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1"), Exp, RM); 3218 EXPECT_EQ(-1, Exp); 3219 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1").bitwiseIsEqual(Frac)); 3220 3221 Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x1p-51"), Exp, RM); 3222 EXPECT_EQ(-50, Exp); 3223 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac)); 3224 3225 Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51"), Exp, RM); 3226 EXPECT_EQ(52, Exp); 3227 EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1").bitwiseIsEqual(Frac)); 3228 } 3229 3230 TEST(APFloatTest, mod) { 3231 { 3232 APFloat f1(APFloat::IEEEdouble(), "1.5"); 3233 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3234 APFloat expected(APFloat::IEEEdouble(), "0.5"); 3235 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3236 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3237 } 3238 { 3239 APFloat f1(APFloat::IEEEdouble(), "0.5"); 3240 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3241 APFloat expected(APFloat::IEEEdouble(), "0.5"); 3242 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3243 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3244 } 3245 { 3246 APFloat f1(APFloat::IEEEdouble(), "0x1.3333333333333p-2"); // 0.3 3247 APFloat f2(APFloat::IEEEdouble(), "0x1.47ae147ae147bp-7"); // 0.01 3248 APFloat expected(APFloat::IEEEdouble(), 3249 "0x1.47ae147ae1471p-7"); // 0.009999999999999983 3250 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3251 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3252 } 3253 { 3254 APFloat f1(APFloat::IEEEdouble(), "0x1p64"); // 1.8446744073709552e19 3255 APFloat f2(APFloat::IEEEdouble(), "1.5"); 3256 APFloat expected(APFloat::IEEEdouble(), "1.0"); 3257 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3258 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3259 } 3260 { 3261 APFloat f1(APFloat::IEEEdouble(), "0x1p1000"); 3262 APFloat f2(APFloat::IEEEdouble(), "0x1p-1000"); 3263 APFloat expected(APFloat::IEEEdouble(), "0.0"); 3264 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3265 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3266 } 3267 { 3268 APFloat f1(APFloat::IEEEdouble(), "0.0"); 3269 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3270 APFloat expected(APFloat::IEEEdouble(), "0.0"); 3271 EXPECT_EQ(f1.mod(f2), APFloat::opOK); 3272 EXPECT_TRUE(f1.bitwiseIsEqual(expected)); 3273 } 3274 { 3275 APFloat f1(APFloat::IEEEdouble(), "1.0"); 3276 APFloat f2(APFloat::IEEEdouble(), "0.0"); 3277 EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp); 3278 EXPECT_TRUE(f1.isNaN()); 3279 } 3280 { 3281 APFloat f1(APFloat::IEEEdouble(), "0.0"); 3282 APFloat f2(APFloat::IEEEdouble(), "0.0"); 3283 EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp); 3284 EXPECT_TRUE(f1.isNaN()); 3285 } 3286 { 3287 APFloat f1 = APFloat::getInf(APFloat::IEEEdouble(), false); 3288 APFloat f2(APFloat::IEEEdouble(), "1.0"); 3289 EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp); 3290 EXPECT_TRUE(f1.isNaN()); 3291 } 3292 } 3293 3294 TEST(APFloatTest, PPCDoubleDoubleAddSpecial) { 3295 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, 3296 APFloat::fltCategory, APFloat::roundingMode>; 3297 DataType Data[] = { 3298 // (1 + 0) + (-1 + 0) = fcZero 3299 std::make_tuple(0x3ff0000000000000ull, 0, 0xbff0000000000000ull, 0, 3300 APFloat::fcZero, APFloat::rmNearestTiesToEven), 3301 // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity 3302 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3303 0x7948000000000000ull, 0ull, APFloat::fcInfinity, 3304 APFloat::rmNearestTiesToEven), 3305 // TODO: change the 4th 0x75effffffffffffe to 0x75efffffffffffff when 3306 // semPPCDoubleDoubleLegacy is gone. 3307 // LDBL_MAX + (1.011111... >> (1023 - 106) + (1.1111111...0 >> (1023 - 3308 // 160))) = fcNormal 3309 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3310 0x7947ffffffffffffull, 0x75effffffffffffeull, 3311 APFloat::fcNormal, APFloat::rmNearestTiesToEven), 3312 // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity 3313 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3314 0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3315 APFloat::fcInfinity, APFloat::rmNearestTiesToEven), 3316 // NaN + (1 + 0) = fcNaN 3317 std::make_tuple(0x7ff8000000000000ull, 0, 0x3ff0000000000000ull, 0, 3318 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3319 }; 3320 3321 for (auto Tp : Data) { 3322 uint64_t Op1[2], Op2[2]; 3323 APFloat::fltCategory Expected; 3324 APFloat::roundingMode RM; 3325 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected, RM) = Tp; 3326 3327 { 3328 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3329 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3330 A1.add(A2, RM); 3331 3332 EXPECT_EQ(Expected, A1.getCategory()) 3333 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1], 3334 Op2[0], Op2[1]) 3335 .str(); 3336 } 3337 { 3338 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3339 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3340 A2.add(A1, RM); 3341 3342 EXPECT_EQ(Expected, A2.getCategory()) 3343 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1], 3344 Op1[0], Op1[1]) 3345 .str(); 3346 } 3347 } 3348 } 3349 3350 TEST(APFloatTest, PPCDoubleDoubleAdd) { 3351 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3352 uint64_t, APFloat::roundingMode>; 3353 DataType Data[] = { 3354 // (1 + 0) + (1e-105 + 0) = (1 + 1e-105) 3355 std::make_tuple(0x3ff0000000000000ull, 0, 0x3960000000000000ull, 0, 3356 0x3ff0000000000000ull, 0x3960000000000000ull, 3357 APFloat::rmNearestTiesToEven), 3358 // (1 + 0) + (1e-106 + 0) = (1 + 1e-106) 3359 std::make_tuple(0x3ff0000000000000ull, 0, 0x3950000000000000ull, 0, 3360 0x3ff0000000000000ull, 0x3950000000000000ull, 3361 APFloat::rmNearestTiesToEven), 3362 // (1 + 1e-106) + (1e-106 + 0) = (1 + 1e-105) 3363 std::make_tuple(0x3ff0000000000000ull, 0x3950000000000000ull, 3364 0x3950000000000000ull, 0, 0x3ff0000000000000ull, 3365 0x3960000000000000ull, APFloat::rmNearestTiesToEven), 3366 // (1 + 0) + (epsilon + 0) = (1 + epsilon) 3367 std::make_tuple(0x3ff0000000000000ull, 0, 0x0000000000000001ull, 0, 3368 0x3ff0000000000000ull, 0x0000000000000001ull, 3369 APFloat::rmNearestTiesToEven), 3370 // TODO: change 0xf950000000000000 to 0xf940000000000000, when 3371 // semPPCDoubleDoubleLegacy is gone. 3372 // (DBL_MAX - 1 << (1023 - 105)) + (1 << (1023 - 53) + 0) = DBL_MAX + 3373 // 1.11111... << (1023 - 52) 3374 std::make_tuple(0x7fefffffffffffffull, 0xf950000000000000ull, 3375 0x7c90000000000000ull, 0, 0x7fefffffffffffffull, 3376 0x7c8ffffffffffffeull, APFloat::rmNearestTiesToEven), 3377 // TODO: change 0xf950000000000000 to 0xf940000000000000, when 3378 // semPPCDoubleDoubleLegacy is gone. 3379 // (1 << (1023 - 53) + 0) + (DBL_MAX - 1 << (1023 - 105)) = DBL_MAX + 3380 // 1.11111... << (1023 - 52) 3381 std::make_tuple(0x7c90000000000000ull, 0, 0x7fefffffffffffffull, 3382 0xf950000000000000ull, 0x7fefffffffffffffull, 3383 0x7c8ffffffffffffeull, APFloat::rmNearestTiesToEven), 3384 }; 3385 3386 for (auto Tp : Data) { 3387 uint64_t Op1[2], Op2[2], Expected[2]; 3388 APFloat::roundingMode RM; 3389 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3390 3391 { 3392 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3393 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3394 A1.add(A2, RM); 3395 3396 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3397 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1], 3398 Op2[0], Op2[1]) 3399 .str(); 3400 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3401 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1], 3402 Op2[0], Op2[1]) 3403 .str(); 3404 } 3405 { 3406 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3407 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3408 A2.add(A1, RM); 3409 3410 EXPECT_EQ(Expected[0], A2.bitcastToAPInt().getRawData()[0]) 3411 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1], 3412 Op1[0], Op1[1]) 3413 .str(); 3414 EXPECT_EQ(Expected[1], A2.bitcastToAPInt().getRawData()[1]) 3415 << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1], 3416 Op1[0], Op1[1]) 3417 .str(); 3418 } 3419 } 3420 } 3421 3422 TEST(APFloatTest, PPCDoubleDoubleSubtract) { 3423 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3424 uint64_t, APFloat::roundingMode>; 3425 DataType Data[] = { 3426 // (1 + 0) - (-1e-105 + 0) = (1 + 1e-105) 3427 std::make_tuple(0x3ff0000000000000ull, 0, 0xb960000000000000ull, 0, 3428 0x3ff0000000000000ull, 0x3960000000000000ull, 3429 APFloat::rmNearestTiesToEven), 3430 // (1 + 0) - (-1e-106 + 0) = (1 + 1e-106) 3431 std::make_tuple(0x3ff0000000000000ull, 0, 0xb950000000000000ull, 0, 3432 0x3ff0000000000000ull, 0x3950000000000000ull, 3433 APFloat::rmNearestTiesToEven), 3434 }; 3435 3436 for (auto Tp : Data) { 3437 uint64_t Op1[2], Op2[2], Expected[2]; 3438 APFloat::roundingMode RM; 3439 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3440 3441 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3442 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3443 A1.subtract(A2, RM); 3444 3445 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3446 << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3447 Op2[1]) 3448 .str(); 3449 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3450 << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3451 Op2[1]) 3452 .str(); 3453 } 3454 } 3455 3456 TEST(APFloatTest, PPCDoubleDoubleMultiplySpecial) { 3457 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, 3458 APFloat::fltCategory, APFloat::roundingMode>; 3459 DataType Data[] = { 3460 // fcNaN * fcNaN = fcNaN 3461 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0, 3462 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3463 // fcNaN * fcZero = fcNaN 3464 std::make_tuple(0x7ff8000000000000ull, 0, 0, 0, APFloat::fcNaN, 3465 APFloat::rmNearestTiesToEven), 3466 // fcNaN * fcInfinity = fcNaN 3467 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff0000000000000ull, 0, 3468 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3469 // fcNaN * fcNormal = fcNaN 3470 std::make_tuple(0x7ff8000000000000ull, 0, 0x3ff0000000000000ull, 0, 3471 APFloat::fcNaN, APFloat::rmNearestTiesToEven), 3472 // fcInfinity * fcInfinity = fcInfinity 3473 std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0, 3474 APFloat::fcInfinity, APFloat::rmNearestTiesToEven), 3475 // fcInfinity * fcZero = fcNaN 3476 std::make_tuple(0x7ff0000000000000ull, 0, 0, 0, APFloat::fcNaN, 3477 APFloat::rmNearestTiesToEven), 3478 // fcInfinity * fcNormal = fcInfinity 3479 std::make_tuple(0x7ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, 3480 APFloat::fcInfinity, APFloat::rmNearestTiesToEven), 3481 // fcZero * fcZero = fcZero 3482 std::make_tuple(0, 0, 0, 0, APFloat::fcZero, 3483 APFloat::rmNearestTiesToEven), 3484 // fcZero * fcNormal = fcZero 3485 std::make_tuple(0, 0, 0x3ff0000000000000ull, 0, APFloat::fcZero, 3486 APFloat::rmNearestTiesToEven), 3487 }; 3488 3489 for (auto Tp : Data) { 3490 uint64_t Op1[2], Op2[2]; 3491 APFloat::fltCategory Expected; 3492 APFloat::roundingMode RM; 3493 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected, RM) = Tp; 3494 3495 { 3496 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3497 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3498 A1.multiply(A2, RM); 3499 3500 EXPECT_EQ(Expected, A1.getCategory()) 3501 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1], 3502 Op2[0], Op2[1]) 3503 .str(); 3504 } 3505 { 3506 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3507 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3508 A2.multiply(A1, RM); 3509 3510 EXPECT_EQ(Expected, A2.getCategory()) 3511 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1], 3512 Op1[0], Op1[1]) 3513 .str(); 3514 } 3515 } 3516 } 3517 3518 TEST(APFloatTest, PPCDoubleDoubleMultiply) { 3519 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3520 uint64_t, APFloat::roundingMode>; 3521 DataType Data[] = { 3522 // 1/3 * 3 = 1.0 3523 std::make_tuple(0x3fd5555555555555ull, 0x3c75555555555556ull, 3524 0x4008000000000000ull, 0, 0x3ff0000000000000ull, 0, 3525 APFloat::rmNearestTiesToEven), 3526 // (1 + epsilon) * (1 + 0) = fcZero 3527 std::make_tuple(0x3ff0000000000000ull, 0x0000000000000001ull, 3528 0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 3529 0x0000000000000001ull, APFloat::rmNearestTiesToEven), 3530 // (1 + epsilon) * (1 + epsilon) = 1 + 2 * epsilon 3531 std::make_tuple(0x3ff0000000000000ull, 0x0000000000000001ull, 3532 0x3ff0000000000000ull, 0x0000000000000001ull, 3533 0x3ff0000000000000ull, 0x0000000000000002ull, 3534 APFloat::rmNearestTiesToEven), 3535 // -(1 + epsilon) * (1 + epsilon) = -1 3536 std::make_tuple(0xbff0000000000000ull, 0x0000000000000001ull, 3537 0x3ff0000000000000ull, 0x0000000000000001ull, 3538 0xbff0000000000000ull, 0, APFloat::rmNearestTiesToEven), 3539 // (0.5 + 0) * (1 + 2 * epsilon) = 0.5 + epsilon 3540 std::make_tuple(0x3fe0000000000000ull, 0, 0x3ff0000000000000ull, 3541 0x0000000000000002ull, 0x3fe0000000000000ull, 3542 0x0000000000000001ull, APFloat::rmNearestTiesToEven), 3543 // (0.5 + 0) * (1 + epsilon) = 0.5 3544 std::make_tuple(0x3fe0000000000000ull, 0, 0x3ff0000000000000ull, 3545 0x0000000000000001ull, 0x3fe0000000000000ull, 0, 3546 APFloat::rmNearestTiesToEven), 3547 // __LDBL_MAX__ * (1 + 1 << 106) = inf 3548 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3549 0x3ff0000000000000ull, 0x3950000000000000ull, 3550 0x7ff0000000000000ull, 0, APFloat::rmNearestTiesToEven), 3551 // __LDBL_MAX__ * (1 + 1 << 107) > __LDBL_MAX__, but not inf, yes =_=||| 3552 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3553 0x3ff0000000000000ull, 0x3940000000000000ull, 3554 0x7fefffffffffffffull, 0x7c8fffffffffffffull, 3555 APFloat::rmNearestTiesToEven), 3556 // __LDBL_MAX__ * (1 + 1 << 108) = __LDBL_MAX__ 3557 std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3558 0x3ff0000000000000ull, 0x3930000000000000ull, 3559 0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3560 APFloat::rmNearestTiesToEven), 3561 }; 3562 3563 for (auto Tp : Data) { 3564 uint64_t Op1[2], Op2[2], Expected[2]; 3565 APFloat::roundingMode RM; 3566 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3567 3568 { 3569 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3570 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3571 A1.multiply(A2, RM); 3572 3573 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3574 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1], 3575 Op2[0], Op2[1]) 3576 .str(); 3577 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3578 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1], 3579 Op2[0], Op2[1]) 3580 .str(); 3581 } 3582 { 3583 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3584 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3585 A2.multiply(A1, RM); 3586 3587 EXPECT_EQ(Expected[0], A2.bitcastToAPInt().getRawData()[0]) 3588 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1], 3589 Op1[0], Op1[1]) 3590 .str(); 3591 EXPECT_EQ(Expected[1], A2.bitcastToAPInt().getRawData()[1]) 3592 << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1], 3593 Op1[0], Op1[1]) 3594 .str(); 3595 } 3596 } 3597 } 3598 3599 TEST(APFloatTest, PPCDoubleDoubleDivide) { 3600 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, 3601 uint64_t, APFloat::roundingMode>; 3602 // TODO: Only a sanity check for now. Add more edge cases when the 3603 // double-double algorithm is implemented. 3604 DataType Data[] = { 3605 // 1 / 3 = 1/3 3606 std::make_tuple(0x3ff0000000000000ull, 0, 0x4008000000000000ull, 0, 3607 0x3fd5555555555555ull, 0x3c75555555555556ull, 3608 APFloat::rmNearestTiesToEven), 3609 }; 3610 3611 for (auto Tp : Data) { 3612 uint64_t Op1[2], Op2[2], Expected[2]; 3613 APFloat::roundingMode RM; 3614 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp; 3615 3616 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3617 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3618 A1.divide(A2, RM); 3619 3620 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3621 << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3622 Op2[1]) 3623 .str(); 3624 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3625 << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3626 Op2[1]) 3627 .str(); 3628 } 3629 } 3630 3631 TEST(APFloatTest, PPCDoubleDoubleRemainder) { 3632 using DataType = 3633 std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>; 3634 DataType Data[] = { 3635 // remainder(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53) 3636 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3637 0x3ff4000000000000ull, 0x3ca4000000000000ull, 3638 0x3fe0000000000000ull, 0x3c90000000000000ull), 3639 // remainder(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (-0.5 - 0.5 << 53) 3640 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3641 0x3ffc000000000000ull, 0x3cac000000000000ull, 3642 0xbfe0000000000000ull, 0xbc90000000000000ull), 3643 }; 3644 3645 for (auto Tp : Data) { 3646 uint64_t Op1[2], Op2[2], Expected[2]; 3647 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1]) = Tp; 3648 3649 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3650 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3651 A1.remainder(A2); 3652 3653 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3654 << formatv("remainder({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3655 Op2[0], Op2[1]) 3656 .str(); 3657 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3658 << formatv("remainder(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], 3659 Op1[1], Op2[0], Op2[1]) 3660 .str(); 3661 } 3662 } 3663 3664 TEST(APFloatTest, PPCDoubleDoubleMod) { 3665 using DataType = 3666 std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>; 3667 DataType Data[] = { 3668 // mod(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53) 3669 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3670 0x3ff4000000000000ull, 0x3ca4000000000000ull, 3671 0x3fe0000000000000ull, 0x3c90000000000000ull), 3672 // mod(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (1.25 + 1.25 << 53) 3673 // 0xbc98000000000000 doesn't seem right, but it's what we currently have. 3674 // TODO: investigate 3675 std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull, 3676 0x3ffc000000000000ull, 0x3cac000000000000ull, 3677 0x3ff4000000000001ull, 0xbc98000000000000ull), 3678 }; 3679 3680 for (auto Tp : Data) { 3681 uint64_t Op1[2], Op2[2], Expected[2]; 3682 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1]) = Tp; 3683 3684 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3685 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3686 A1.mod(A2); 3687 3688 EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0]) 3689 << formatv("fmod(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3690 Op2[0], Op2[1]) 3691 .str(); 3692 EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1]) 3693 << formatv("fmod(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3694 Op2[0], Op2[1]) 3695 .str(); 3696 } 3697 } 3698 3699 TEST(APFloatTest, PPCDoubleDoubleFMA) { 3700 // Sanity check for now. 3701 APFloat A(APFloat::PPCDoubleDouble(), "2"); 3702 A.fusedMultiplyAdd(APFloat(APFloat::PPCDoubleDouble(), "3"), 3703 APFloat(APFloat::PPCDoubleDouble(), "4"), 3704 APFloat::rmNearestTiesToEven); 3705 EXPECT_EQ(APFloat::cmpEqual, 3706 APFloat(APFloat::PPCDoubleDouble(), "10").compare(A)); 3707 } 3708 3709 TEST(APFloatTest, PPCDoubleDoubleRoundToIntegral) { 3710 { 3711 APFloat A(APFloat::PPCDoubleDouble(), "1.5"); 3712 A.roundToIntegral(APFloat::rmNearestTiesToEven); 3713 EXPECT_EQ(APFloat::cmpEqual, 3714 APFloat(APFloat::PPCDoubleDouble(), "2").compare(A)); 3715 } 3716 { 3717 APFloat A(APFloat::PPCDoubleDouble(), "2.5"); 3718 A.roundToIntegral(APFloat::rmNearestTiesToEven); 3719 EXPECT_EQ(APFloat::cmpEqual, 3720 APFloat(APFloat::PPCDoubleDouble(), "2").compare(A)); 3721 } 3722 } 3723 3724 TEST(APFloatTest, PPCDoubleDoubleCompare) { 3725 using DataType = 3726 std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, APFloat::cmpResult>; 3727 3728 DataType Data[] = { 3729 // (1 + 0) = (1 + 0) 3730 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, 3731 APFloat::cmpEqual), 3732 // (1 + 0) < (1.00...1 + 0) 3733 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 0, 3734 APFloat::cmpLessThan), 3735 // (1.00...1 + 0) > (1 + 0) 3736 std::make_tuple(0x3ff0000000000001ull, 0, 0x3ff0000000000000ull, 0, 3737 APFloat::cmpGreaterThan), 3738 // (1 + 0) < (1 + epsilon) 3739 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 3740 0x0000000000000001ull, APFloat::cmpLessThan), 3741 // NaN != NaN 3742 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0, 3743 APFloat::cmpUnordered), 3744 // (1 + 0) != NaN 3745 std::make_tuple(0x3ff0000000000000ull, 0, 0x7ff8000000000000ull, 0, 3746 APFloat::cmpUnordered), 3747 // Inf = Inf 3748 std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0, 3749 APFloat::cmpEqual), 3750 }; 3751 3752 for (auto Tp : Data) { 3753 uint64_t Op1[2], Op2[2]; 3754 APFloat::cmpResult Expected; 3755 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected) = Tp; 3756 3757 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3758 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3759 EXPECT_EQ(Expected, A1.compare(A2)) 3760 << formatv("compare(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1], 3761 Op2[0], Op2[1]) 3762 .str(); 3763 } 3764 } 3765 3766 TEST(APFloatTest, PPCDoubleDoubleBitwiseIsEqual) { 3767 using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, bool>; 3768 3769 DataType Data[] = { 3770 // (1 + 0) = (1 + 0) 3771 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, true), 3772 // (1 + 0) != (1.00...1 + 0) 3773 std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 0, 3774 false), 3775 // NaN = NaN 3776 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0, true), 3777 // NaN != NaN with a different bit pattern 3778 std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 3779 0x3ff0000000000000ull, false), 3780 // Inf = Inf 3781 std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0, true), 3782 }; 3783 3784 for (auto Tp : Data) { 3785 uint64_t Op1[2], Op2[2]; 3786 bool Expected; 3787 std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected) = Tp; 3788 3789 APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1)); 3790 APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2)); 3791 EXPECT_EQ(Expected, A1.bitwiseIsEqual(A2)) 3792 << formatv("({0:x} + {1:x}) = ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0], 3793 Op2[1]) 3794 .str(); 3795 } 3796 } 3797 3798 TEST(APFloatTest, PPCDoubleDoubleHashValue) { 3799 uint64_t Data1[] = {0x3ff0000000000001ull, 0x0000000000000001ull}; 3800 uint64_t Data2[] = {0x3ff0000000000001ull, 0}; 3801 // The hash values are *hopefully* different. 3802 EXPECT_NE( 3803 hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data1))), 3804 hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data2)))); 3805 } 3806 3807 TEST(APFloatTest, PPCDoubleDoubleChangeSign) { 3808 uint64_t Data[] = { 3809 0x400f000000000000ull, 0xbcb0000000000000ull, 3810 }; 3811 APFloat Float(APFloat::PPCDoubleDouble(), APInt(128, 2, Data)); 3812 { 3813 APFloat Actual = 3814 APFloat::copySign(Float, APFloat(APFloat::IEEEdouble(), "1")); 3815 EXPECT_EQ(0x400f000000000000ull, Actual.bitcastToAPInt().getRawData()[0]); 3816 EXPECT_EQ(0xbcb0000000000000ull, Actual.bitcastToAPInt().getRawData()[1]); 3817 } 3818 { 3819 APFloat Actual = 3820 APFloat::copySign(Float, APFloat(APFloat::IEEEdouble(), "-1")); 3821 EXPECT_EQ(0xc00f000000000000ull, Actual.bitcastToAPInt().getRawData()[0]); 3822 EXPECT_EQ(0x3cb0000000000000ull, Actual.bitcastToAPInt().getRawData()[1]); 3823 } 3824 } 3825 3826 TEST(APFloatTest, PPCDoubleDoubleFactories) { 3827 { 3828 uint64_t Data[] = { 3829 0, 0, 3830 }; 3831 EXPECT_EQ(APInt(128, 2, Data), 3832 APFloat::getZero(APFloat::PPCDoubleDouble()).bitcastToAPInt()); 3833 } 3834 { 3835 uint64_t Data[] = { 3836 0x7fefffffffffffffull, 0x7c8ffffffffffffeull, 3837 }; 3838 EXPECT_EQ(APInt(128, 2, Data), 3839 APFloat::getLargest(APFloat::PPCDoubleDouble()).bitcastToAPInt()); 3840 } 3841 { 3842 uint64_t Data[] = { 3843 0x0000000000000001ull, 0, 3844 }; 3845 EXPECT_EQ( 3846 APInt(128, 2, Data), 3847 APFloat::getSmallest(APFloat::PPCDoubleDouble()).bitcastToAPInt()); 3848 } 3849 { 3850 uint64_t Data[] = {0x0360000000000000ull, 0}; 3851 EXPECT_EQ(APInt(128, 2, Data), 3852 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble()) 3853 .bitcastToAPInt()); 3854 } 3855 { 3856 uint64_t Data[] = { 3857 0x8000000000000000ull, 0x0000000000000000ull, 3858 }; 3859 EXPECT_EQ( 3860 APInt(128, 2, Data), 3861 APFloat::getZero(APFloat::PPCDoubleDouble(), true).bitcastToAPInt()); 3862 } 3863 { 3864 uint64_t Data[] = { 3865 0xffefffffffffffffull, 0xfc8ffffffffffffeull, 3866 }; 3867 EXPECT_EQ( 3868 APInt(128, 2, Data), 3869 APFloat::getLargest(APFloat::PPCDoubleDouble(), true).bitcastToAPInt()); 3870 } 3871 { 3872 uint64_t Data[] = { 3873 0x8000000000000001ull, 0x0000000000000000ull, 3874 }; 3875 EXPECT_EQ(APInt(128, 2, Data), 3876 APFloat::getSmallest(APFloat::PPCDoubleDouble(), true) 3877 .bitcastToAPInt()); 3878 } 3879 { 3880 uint64_t Data[] = { 3881 0x8360000000000000ull, 0x0000000000000000ull, 3882 }; 3883 EXPECT_EQ(APInt(128, 2, Data), 3884 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble(), true) 3885 .bitcastToAPInt()); 3886 } 3887 EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isSmallest()); 3888 EXPECT_TRUE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isLargest()); 3889 } 3890 3891 TEST(APFloatTest, PPCDoubleDoubleIsDenormal) { 3892 EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isDenormal()); 3893 EXPECT_FALSE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isDenormal()); 3894 EXPECT_FALSE( 3895 APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble()).isDenormal()); 3896 { 3897 // (4 + 3) is not normalized 3898 uint64_t Data[] = { 3899 0x4010000000000000ull, 0x4008000000000000ull, 3900 }; 3901 EXPECT_TRUE( 3902 APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data)).isDenormal()); 3903 } 3904 } 3905 3906 TEST(APFloatTest, PPCDoubleDoubleScalbn) { 3907 // 3.0 + 3.0 << 53 3908 uint64_t Input[] = { 3909 0x4008000000000000ull, 0x3cb8000000000000ull, 3910 }; 3911 APFloat Result = 3912 scalbn(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input)), 1, 3913 APFloat::rmNearestTiesToEven); 3914 // 6.0 + 6.0 << 53 3915 EXPECT_EQ(0x4018000000000000ull, Result.bitcastToAPInt().getRawData()[0]); 3916 EXPECT_EQ(0x3cc8000000000000ull, Result.bitcastToAPInt().getRawData()[1]); 3917 } 3918 3919 TEST(APFloatTest, PPCDoubleDoubleFrexp) { 3920 // 3.0 + 3.0 << 53 3921 uint64_t Input[] = { 3922 0x4008000000000000ull, 0x3cb8000000000000ull, 3923 }; 3924 int Exp; 3925 // 0.75 + 0.75 << 53 3926 APFloat Result = 3927 frexp(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input)), Exp, 3928 APFloat::rmNearestTiesToEven); 3929 EXPECT_EQ(2, Exp); 3930 EXPECT_EQ(0x3fe8000000000000ull, Result.bitcastToAPInt().getRawData()[0]); 3931 EXPECT_EQ(0x3c98000000000000ull, Result.bitcastToAPInt().getRawData()[1]); 3932 } 3933 } 3934