Skip to content

Fix Uniform::new_inclusive overflow on large finite float ranges - #1821

Merged
dhardy merged 7 commits into
masterfrom
push-zwrtyxtlykum
Aug 30, 2026
Merged

Fix Uniform::new_inclusive overflow on large finite float ranges#1821
dhardy merged 7 commits into
masterfrom
push-zwrtyxtlykum

Conversation

@dhardy

@dhardy dhardy commented Aug 5, 2026

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Replaces #1809, allowing Uniform::new_inclusive to accept ranges like 0.0..=f64::MAX which overflow-to-infinity, without extra code.

Details

This allows UniformFloat::new_inclusive(0.0, f64::MAX) to return a valid sampler, though in practice the largest value which may be sampled remains 1.next_down() * MAX = MAX.next_down().

This is slightly more consistent with sample_single_inclusive which also accepts this range and also does not actually ever emit the largest value.

teddytennant and others added 6 commits July 11, 2026 13:25
Dividing high - low by 1 - EPSILON can round to infinity even when the
range itself is finite (e.g. 0.0..=f64::MAX), yielding a spurious
NonFinite error while Uniform::new and sample_single_inclusive both
accept the same range. Clamp infinite lanes to the largest finite value
and let new_bounded reduce scale as usual, so that samples still cannot
exceed high.

Noted by dhardy in #1603.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes Uniform::new_inclusive for floating-point ranges where (high - low) / (1 - ε) can round to infinity even though (high - low) is finite (e.g. 0.0..=f64::MAX), aligning behavior with sample_single_inclusive and avoiding spurious Error::NonFinite.

Changes:

  • Adjust UniformFloat::new_inclusive to validate (high - low) for finiteness before scaling, allowing large finite inclusive ranges that previously overflowed during scaling.
  • Update the new_bounded scale-reduction loop to use <= masking plus all() (instead of > plus any()), and add targeted tests for decrease_masked (including infinity cases).
  • Add a CHANGELOG.md entry documenting the fix.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
src/distr/utils.rs Renames/adjusts float mask utilities and adds tests for decrease_masked, including infinity handling.
src/distr/uniform_float.rs Fixes new_inclusive overflow-to-infinity rejection for large finite float ranges and extends test coverage for those bounds.
CHANGELOG.md Documents the Uniform::new_inclusive large-range fix in Unreleased notes.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/distr/uniform_float.rs Outdated
Comment thread src/distr/utils.rs Outdated
@dhardy

dhardy commented Aug 30, 2026

Copy link
Copy Markdown
Member Author

To avoid stalling this fix further I will now merge it without third-party review.

@dhardy
dhardy merged commit 94c9078 into master Aug 30, 2026
17 checks passed
@dhardy
dhardy deleted the push-zwrtyxtlykum branch August 30, 2026 08:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants