fix: make ScalarValue::eq_array match float PartialEq - #24499
Open
shinzoxD wants to merge 1 commit into
Open
Conversation
Use bit-pattern comparison for Float16/32/64 in eq_array so it matches ScalarValue::PartialEq: identical NaNs compare equal and signed zeros remain distinct.
Contributor
|
we have a PR for this |
Contributor
|
for anyone looking at this PR please see my comment here: |
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.
Which issue does this PR close?
ScalarValue::eq_arrayis inconsistent withScalarValueequality for floating-point values #24431Rationale for this change
ScalarValue::eq_arrayis documented as an optimized equivalent of extracting an array element withtry_from_arrayand comparing the resulting scalars. For floating-point values this was not true:eq_arrayused IEEE equality whileScalarValue::PartialEqcompares bit patterns.That produced inconsistent results for hash-table key comparisons and any other caller of
eq_array:ScalarValues but unequal througheq_array.+0.0and-0.0compared unequal asScalarValues but equal througheq_array.Changing
PartialEqto IEEE equality would breakEqreflexivity for NaNs and require coordinated hash/order changes. The correct fix is foreq_arrayto match the existingPartialEqcontract.What changes are included in this PR?
Float16,Float32, andFloat64ineq_arrayusingto_bits(), matchingScalarValue::PartialEq.eq_array.Are these changes tested?
Yes.
test_eq_array_float_nan_and_signed_zerochecks thateq_arraymatchestry_from_array+PartialEqfor Float16/32/64, including:+0.0and-0.0remain distinctWithout the
to_bits()change the new test fails (identical NaN:eq_arrayfalse vsPartialEqtrue).Are there any user-facing changes?
Yes. Callers of
ScalarValue::eq_arrayon floating-point values now get the same results asScalarValue::eq. This is a behavior fix for the documented API contract;PartialEqitself is unchanged.No documentation site updates are needed beyond the rustdoc note on
eq_array.