[llvm] APFloat: fix wrong result status for large floats (PR #189925)
Max Graey via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 12 06:59:05 PDT 2026
================
@@ -10206,4 +10206,25 @@ TEST(APFloatTest, isValidArbitraryFPFormat) {
EXPECT_FALSE(APFloat::isValidArbitraryFPFormat("unknown"));
}
+TEST(APFloatTest, DecimalStringPreservesInexactStatus) {
+ APFloat F(APFloat::IEEEsingle());
+
+ auto StatusOr = F.convertFromString("10384593717069655257060992658440193.0",
+ APFloat::rmNearestTiesToEven);
+ ASSERT_TRUE(!!StatusOr);
+
+ APFloat::opStatus Status = *StatusOr;
+
+ // The value is 2^113 + 1, not exactly representable in float.
+ EXPECT_TRUE(Status & APFloat::opInexact);
+
+ // But it should round to exactly 2^113.
+ APFloat Expected(APFloat::IEEEsingle());
+ auto ExpectedStatus =
+ Expected.convertFromString("0x1p113", APFloat::rmNearestTiesToEven);
+ ASSERT_TRUE(!!ExpectedStatus);
+
----------------
MaxGraey wrote:
Add a little paranoid check. Just in case:
```suggestion
EXPECT_FALSE(*ExpectedStatus & APFloat::opInexact);
```
https://github.com/llvm/llvm-project/pull/189925
More information about the llvm-commits
mailing list