16
16
#include " llvm/Support/FormatVariadic.h"
17
17
#include " gtest/gtest.h"
18
18
#include < cmath>
19
+ #include < limits>
19
20
#include < ostream>
20
21
#include < string>
21
22
#include < tuple>
@@ -8358,9 +8359,24 @@ TEST(APFloatTest, hasSignBitInMSB) {
8358
8359
8359
8360
#ifdef LLVM_INTEGRATE_LIBC
8360
8361
TEST (APFloatTest, expf) {
8361
- EXPECT_EQ (
8362
- 1 .0f ,
8363
- llvm::exp (APFloat (0 .0f ), APFloat::rmNearestTiesToEven).convertToFloat ());
8362
+ std::array<llvm::RoundingMode, 4 > allRoundingModes = {
8363
+ APFloat::rmNearestTiesToEven, APFloat::rmTowardPositive,
8364
+ APFloat::rmTowardNegative, APFloat::rmTowardZero};
8365
+ for (auto rm : allRoundingModes) {
8366
+ // exp(+-0) = 1 for all rounding modes.
8367
+ EXPECT_EQ (1 .0f , llvm::exp (APFloat (0 .0f ), rm).convertToFloat ());
8368
+ EXPECT_EQ (1 .0f , llvm::exp (APFloat (-0 .0f ), rm).convertToFloat ());
8369
+ // exp(+Inf) = +Inf for all rounding modes.
8370
+ EXPECT_EQ (std::numeric_limits<float >::infinity (),
8371
+ llvm::exp (APFloat::getInf (APFloat::IEEEsingle (), false ), rm)
8372
+ .convertToFloat ());
8373
+ // exp(-Inf) = 0 for all rounding modes.
8374
+ EXPECT_EQ (0 .0f , llvm::exp (APFloat::getInf (APFloat::IEEEsingle (), true ), rm)
8375
+ .convertToFloat ());
8376
+ // exp(NaN) = NaN for all rounding modes.
8377
+ EXPECT_TRUE (llvm::exp (APFloat::getNaN (APFloat::IEEEsingle ()), rm).isNaN ());
8378
+ }
8379
+ // exp(1)
8364
8380
EXPECT_EQ (
8365
8381
0x1 .5bf0a8p1f,
8366
8382
llvm::exp (APFloat (1 .0f ), APFloat::rmNearestTiesToEven).convertToFloat ());
@@ -8372,6 +8388,37 @@ TEST(APFloatTest, expf) {
8372
8388
llvm::exp (APFloat (1 .0f ), APFloat::rmTowardNegative).convertToFloat ());
8373
8389
EXPECT_EQ (0x1 .5bf0a8p1f,
8374
8390
llvm::exp (APFloat (1 .0f ), APFloat::rmTowardZero).convertToFloat ());
8391
+ // exp(float max)
8392
+ EXPECT_EQ (std::numeric_limits<float >::infinity (),
8393
+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
8394
+ APFloat::rmNearestTiesToEven)
8395
+ .convertToFloat ());
8396
+ EXPECT_EQ (std::numeric_limits<float >::infinity (),
8397
+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
8398
+ APFloat::rmTowardPositive)
8399
+ .convertToFloat ());
8400
+ EXPECT_EQ (std::numeric_limits<float >::max (),
8401
+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
8402
+ APFloat::rmTowardNegative)
8403
+ .convertToFloat ());
8404
+ EXPECT_EQ (std::numeric_limits<float >::max (),
8405
+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
8406
+ APFloat::rmTowardZero)
8407
+ .convertToFloat ());
8408
+ // exp(min_denormal)
8409
+ EXPECT_EQ (1 .0f , llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
8410
+ APFloat::rmNearestTiesToEven)
8411
+ .convertToFloat ());
8412
+ EXPECT_EQ (0x1 .000002p0,
8413
+ llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
8414
+ APFloat::rmTowardPositive)
8415
+ .convertToFloat ());
8416
+ EXPECT_EQ (1 .0f , llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
8417
+ APFloat::rmTowardNegative)
8418
+ .convertToFloat ());
8419
+ EXPECT_EQ (1 .0f , llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
8420
+ APFloat::rmTowardZero)
8421
+ .convertToFloat ());
8375
8422
}
8376
8423
#endif // LLVM_INTEGRATE_LIBC
8377
8424
0 commit comments