@@ -10182,4 +10182,78 @@ TEST(APFloatTest, FrexpQuietSNaN) {
1018210182 EXPECT_FALSE (Result.isSignaling ());
1018310183}
1018410184
10185+ TEST (APFloatTest, expf) {
10186+ std::array<llvm::RoundingMode, 4 > allRoundingModes = {
10187+ APFloat::rmNearestTiesToEven, APFloat::rmTowardPositive,
10188+ APFloat::rmTowardNegative, APFloat::rmTowardZero};
10189+ for (auto rm : allRoundingModes) {
10190+ // exp(+-0) = 1 for all rounding modes.
10191+ EXPECT_EQ (1 .0f , llvm::exp (APFloat (0 .0f ), rm).convertToFloat ());
10192+ EXPECT_EQ (1 .0f , llvm::exp (APFloat (-0 .0f ), rm).convertToFloat ());
10193+ // exp(+Inf) = +Inf for all rounding modes.
10194+ EXPECT_EQ (std::numeric_limits<float >::infinity (),
10195+ llvm::exp (APFloat::getInf (APFloat::IEEEsingle (), false ), rm)
10196+ .convertToFloat ());
10197+ // exp(-Inf) = 0 for all rounding modes.
10198+ EXPECT_EQ (0 .0f , llvm::exp (APFloat::getInf (APFloat::IEEEsingle (), true ), rm)
10199+ .convertToFloat ());
10200+ // exp(NaN) = NaN for all rounding modes.
10201+ EXPECT_TRUE (llvm::exp (APFloat::getNaN (APFloat::IEEEsingle ()), rm).isNaN ());
10202+ }
10203+ // exp(1)
10204+ EXPECT_EQ (
10205+ 0x1 .5bf0a8p1f,
10206+ llvm::exp (APFloat (1 .0f ), APFloat::rmNearestTiesToEven).convertToFloat ());
10207+ EXPECT_EQ (
10208+ 0x1 .5bf0aap1f,
10209+ llvm::exp (APFloat (1 .0f ), APFloat::rmTowardPositive).convertToFloat ());
10210+ EXPECT_EQ (
10211+ 0x1 .5bf0a8p1f,
10212+ llvm::exp (APFloat (1 .0f ), APFloat::rmTowardNegative).convertToFloat ());
10213+ EXPECT_EQ (0x1 .5bf0a8p1f,
10214+ llvm::exp (APFloat (1 .0f ), APFloat::rmTowardZero).convertToFloat ());
10215+ // exp(float max)
10216+ EXPECT_EQ (std::numeric_limits<float >::infinity (),
10217+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
10218+ APFloat::rmNearestTiesToEven)
10219+ .convertToFloat ());
10220+ EXPECT_EQ (std::numeric_limits<float >::infinity (),
10221+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
10222+ APFloat::rmTowardPositive)
10223+ .convertToFloat ());
10224+ EXPECT_EQ (std::numeric_limits<float >::max (),
10225+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
10226+ APFloat::rmTowardNegative)
10227+ .convertToFloat ());
10228+ EXPECT_EQ (std::numeric_limits<float >::max (),
10229+ llvm::exp (APFloat::getLargest (APFloat::IEEEsingle (), false ),
10230+ APFloat::rmTowardZero)
10231+ .convertToFloat ());
10232+ // exp(min_denormal)
10233+ EXPECT_EQ (1 .0f , llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
10234+ APFloat::rmNearestTiesToEven)
10235+ .convertToFloat ());
10236+ EXPECT_EQ (0x1 .000002p0f,
10237+ llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
10238+ APFloat::rmTowardPositive)
10239+ .convertToFloat ());
10240+ EXPECT_EQ (1 .0f , llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
10241+ APFloat::rmTowardNegative)
10242+ .convertToFloat ());
10243+ EXPECT_EQ (1 .0f , llvm::exp (APFloat::getSmallest (APFloat::IEEEsingle (), false ),
10244+ APFloat::rmTowardZero)
10245+ .convertToFloat ());
10246+ // Default rounding mode.
10247+ // exp(-1)
10248+ EXPECT_EQ (0x1 .78b564p-2f , llvm::exp (APFloat (-1 .0f )).convertToFloat ());
10249+ EXPECT_EQ (
10250+ 0x1 .78b564p-2f ,
10251+ llvm::exp (APFloat (-1 .0f ), APFloat::rmTowardPositive).convertToFloat ());
10252+ EXPECT_EQ (
10253+ 0x1 .78b562p-2f ,
10254+ llvm::exp (APFloat (-1 .0f ), APFloat::rmTowardNegative).convertToFloat ());
10255+ EXPECT_EQ (0x1 .78b562p-2f ,
10256+ llvm::exp (APFloat (-1 .0f ), APFloat::rmTowardZero).convertToFloat ());
10257+ }
10258+
1018510259} // namespace
0 commit comments