From 98bfb23605193d287958f6cfb287df5761209e0a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 21 Aug 2026 13:31:17 +0000 Subject: [PATCH] fix: avoid overflow in `stats/base/dists/rayleigh/quantile` Propagates fix from f51d7fed ("fix: avoid overflow and duplicate computation") to the Rayleigh quantile function, which computed an unnecessary intermediate `sigma*sigma` that overflows to infinity for `sigma > ~1.34e154` (returning `Infinity` for all probabilities) and underflows for `sigma < ~1.5e-154` (returning `0`). Factoring `sigma` out of the square root avoids the squaring entirely. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_01TXQVJeeR1SEeUHiN9Q58eY --- .../@stdlib/stats/base/dists/rayleigh/quantile/lib/factory.js | 4 +--- .../@stdlib/stats/base/dists/rayleigh/quantile/lib/main.js | 4 +--- .../@stdlib/stats/base/dists/rayleigh/quantile/src/main.c | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/factory.js b/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/factory.js index 8f63e60e035f..725792c60a34 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/factory.js +++ b/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/factory.js @@ -44,14 +44,12 @@ var sqrt = require( '@stdlib/math/base/special/sqrt' ); * // returns ~17.941 */ function factory( sigma ) { - var s2; if ( isnan( sigma ) || sigma < 0.0 ) { return constantFunction( NaN ); } if ( sigma === 0.0 ) { return degenerate( 0.0 ); } - s2 = sigma * sigma; return quantile; /** @@ -69,7 +67,7 @@ function factory( sigma ) { if ( isnan( p ) || p < 0.0 || p > 1.0 ) { return NaN; } - return sqrt( -2.0 * s2 * log1p( -p ) ); + return sigma * sqrt( -2.0 * log1p( -p ) ); } } diff --git a/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/main.js b/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/main.js index 278f2adb18eb..3c5c8ab99c8c 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/main.js +++ b/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/lib/main.js @@ -64,7 +64,6 @@ var sqrt = require( '@stdlib/math/base/special/sqrt' ); * // returns NaN */ function quantile( p, sigma ) { - var s2; if ( isnan( sigma ) || sigma < 0.0 ) { return NaN; } @@ -74,8 +73,7 @@ function quantile( p, sigma ) { if ( sigma === 0.0 ) { return 0.0; } - s2 = sigma * sigma; - return sqrt( -2.0 * s2 * log1p( -p ) ); + return sigma * sqrt( -2.0 * log1p( -p ) ); } diff --git a/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/src/main.c b/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/src/main.c index edfaafcf88ab..0649baea331a 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/src/main.c +++ b/lib/node_modules/@stdlib/stats/base/dists/rayleigh/quantile/src/main.c @@ -33,7 +33,6 @@ * // returns ~1.794 */ double stdlib_base_dists_rayleigh_quantile( const double p, const double sigma ) { - double s2; if ( stdlib_base_is_nan( p ) || stdlib_base_is_nan( sigma ) || @@ -46,6 +45,5 @@ double stdlib_base_dists_rayleigh_quantile( const double p, const double sigma ) if ( sigma == 0.0 ) { return 0.0; } - s2 = sigma * sigma; - return stdlib_base_sqrt( -2.0 * s2 * stdlib_base_log1p( -p ) ); + return sigma * stdlib_base_sqrt( -2.0 * stdlib_base_log1p( -p ) ); }