Skip to content

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

Open
dhardy wants to merge 7 commits into
masterfrom
push-zwrtyxtlykum
Open

Fix Uniform::new_inclusive overflow on large finite float ranges#1821
dhardy wants to merge 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 on lines +60 to +61
/// Requirements: `low` and `high` must be finite. `scale` may be
/// infinite but must not be NaN.
Comment thread src/distr/utils.rs Outdated
Comment on lines +224 to +226
// Decrease all lanes where the mask is `true` to the next lower value
// representable by the floating-point type. At least one of the lanes
// must be set.
// must be set. Inputs may be non-finite but must not be NaN.
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