From 1bc91c2ab47eb73125401ce4f85174732fd446db Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 7 Oct 2026 12:39:36 +0000 Subject: [PATCH] fix: return `0` when `p = 1` in `stats/base/dists/negative-binomial/quantile` When `p = 1`, the distribution is degenerate at `0`, but the Cornish-Fisher initial guess evaluates to `NaN` (`sigmaInv = Infinity`), causing the JS and C implementations to return `NaN`. Additionally restores the blank lines before line comments in `lib/factory.js` (`stdlib/empty-line-before-comment`). Ref: 5fc7eb73c70d2d792732b1de36699fb754b41b6c Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Cio3EetT4BiFSZQWkoKDeW --- .../negative-binomial/quantile/lib/factory.js | 5 +++++ .../dists/negative-binomial/quantile/lib/main.js | 3 +++ .../dists/negative-binomial/quantile/src/main.c | 3 +++ .../quantile/test/test.factory.js | 15 +++++++++++++++ .../negative-binomial/quantile/test/test.main.js | 12 ++++++++++++ .../quantile/test/test.native.js | 12 ++++++++++++ 6 files changed, 50 insertions(+) diff --git a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/factory.js b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/factory.js index 6e7eef33833d..d403e5d837bf 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/factory.js +++ b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/factory.js @@ -88,16 +88,21 @@ function factory( r, p ) { if ( isnan( k ) || k < 0.0 || k > 1.0 ) { return NaN; } + if ( p === 1.0 ) { + return 0.0; + } if ( k === 0.0 ) { return 0.0; } if ( k === 1.0 ) { return PINF; } + // If the mean overflows double-precision floating-point format, the sought quantile saturates at positive infinity: if ( mu === PINF ) { return PINF; } + // Cornish-Fisher expansion: if ( k < 0.5 ) { x = -erfcinv( 2.0 * k ) * SQRT2; diff --git a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/main.js b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/main.js index d58c5431f8d9..0de81b47f1c4 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/main.js +++ b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/lib/main.js @@ -118,6 +118,9 @@ function quantile( k, r, p ) { ) { return NaN; } + if ( p === 1.0 ) { + return 0.0; + } if ( k === 0.0 ) { return 0.0; } diff --git a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/src/main.c b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/src/main.c index 1e62a238838d..ac234cdbbe57 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/src/main.c +++ b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/src/main.c @@ -106,6 +106,9 @@ double stdlib_base_dists_negative_binomial_quantile( const double k, const doubl ) { return 0.0 / 0.0; // NaN } + if ( p == 1.0 ) { + return 0.0; + } if ( k == 0.0 ) { return 0.0; } diff --git a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.factory.js b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.factory.js index c9dc483a0232..cf81f6cf3f10 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.factory.js +++ b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.factory.js @@ -156,6 +156,21 @@ tape( 'if provided a success probability `p` equal to `0`, the created function t.end(); }); +tape( 'if provided a success probability `p` equal to `1`, the created function always returns `0`', function test( t ) { + var quantile; + var y; + + quantile = factory( 20.0, 1.0 ); + + y = quantile( 0.5 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 0.9 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + t.end(); +}); + tape( 'if the distribution mean overflows double-precision floating-point format, the created function returns `+infinity`', function test( t ) { var quantile; var y; diff --git a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.main.js b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.main.js index 4fd65da45c6d..ef8bb1cd1cde 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.main.js +++ b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.main.js @@ -106,6 +106,18 @@ tape( 'if provided a success probability `p` equal to `0`, the function returns t.end(); }); +tape( 'if provided a success probability `p` equal to `1`, the function returns `0`', function test( t ) { + var y; + + y = quantile( 0.5, 20, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 0.9, 10, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + t.end(); +}); + tape( 'if the distribution mean overflows double-precision floating-point format, the function returns `+infinity`', function test( t ) { var y; diff --git a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.native.js b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.native.js index 31ce5b92aef5..0a202c12a685 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.native.js +++ b/lib/node_modules/@stdlib/stats/base/dists/negative-binomial/quantile/test/test.native.js @@ -115,6 +115,18 @@ tape( 'if provided a success probability `p` equal to `0`, the function returns t.end(); }); +tape( 'if provided a success probability `p` equal to `1`, the function returns `0`', opts, function test( t ) { + var y; + + y = quantile( 0.5, 20, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + y = quantile( 0.9, 10, 1.0 ); + t.strictEqual( y, 0.0, 'returns expected value' ); + + t.end(); +}); + tape( 'if the distribution mean overflows double-precision floating-point format, the function returns `+infinity`', opts, function test( t ) { var y;