[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