1616#include " llvm/Support/FormatVariadic.h"
1717#include " gtest/gtest.h"
1818#include < cmath>
19+ #include < limits>
1920#include < ostream>
2021#include < string>
2122#include < tuple>
@@ -8358,9 +8359,24 @@ TEST(APFloatTest, hasSignBitInMSB) {
83588359
83598360#ifdef LLVM_INTEGRATE_LIBC
83608361TEST (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)
83648380 EXPECT_EQ (
83658381 0x1 .5bf0a8p1f,
83668382 llvm::exp (APFloat (1 .0f ), APFloat::rmNearestTiesToEven).convertToFloat ());
@@ -8372,6 +8388,37 @@ TEST(APFloatTest, expf) {
83728388 llvm::exp (APFloat (1 .0f ), APFloat::rmTowardNegative).convertToFloat ());
83738389 EXPECT_EQ (0x1 .5bf0a8p1f,
83748390 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 ());
83758422}
83768423#endif // LLVM_INTEGRATE_LIBC
83778424
0 commit comments