test: make ValueTest/objects float check robust against x87 excess precision#1700
Open
plusky wants to merge 1 commit into
Open
test: make ValueTest/objects float check robust against x87 excess precision#1700plusky wants to merge 1 commit into
plusky wants to merge 1 commit into
Conversation
…ecision ValueTest/objects stores the float literal 0.12345f into a Json::Value (widened to the stored double) and then asserts equality against the original 0.12345f. On 32-bit x86 targets where GCC defaults to x87 math (-mfpmath=387, 80-bit excess precision) and the baseline lacks SSE2, the round-trip yields the exact double 0.12345 rather than the float-widened 0.12345000356435776, so the exact double comparison fails even though the library itself is correct. Compare the stored value narrowed back to float via asFloat(): both the expected literal and asFloat() collapse to the same float value on every architecture, keeping the numeric round-trip check while making it precision-robust.
plusky
added a commit
to plusky/openSUSE-packaging-skill
that referenced
this pull request
Jun 25, 2026
Document the i586-only exact-float-compare test failure pattern: x87 80-bit excess precision; -fexcess-precision=standard is a no-op; -mfpmath=sse/-msse2 is unsafe (no SSE2 in the i586 baseline -> SIGILL); fix by narrowing both sides to float (asFloat()/cast); and verify via the server-side i586 build (not flaky local QEMU) before the Factory SR. Real case: jsoncpp 1.9.8 ValueTest/objects, upstream PR gh#open-source-parsers/jsoncpp#1700.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On 32-bit x86 (i586/i686) where GCC defaults to x87 math (
-mfpmath=387, 80-bit excess precision) and the baseline has no SSE2,ValueTest/objectsfails:The test stores the float literal
0.12345finto aJson::Value(widened to the storeddouble) and then asserts equality against the original0.12345f. On x87 the stored value round-trips to the exact double0.12345instead of the float-widened0.12345000356435776, so the exactdoublecomparison fails — even though the library is correct.This makes the check precision-robust by comparing the stored value narrowed back to
floatviaasFloat(): both sides collapse to the samefloaton every architecture, so the numeric round-trip is still verified but the test no longer depends on x87 vs IEEE double representation.Found while building jsoncpp 1.9.8 for openSUSE on the i586 architecture (no SSE2 in the baseline, so
-mfpmath=sseis not an option).