From 58b06c0a2ec92d85098cf68a0f3a4f4eb5387d3b Mon Sep 17 00:00:00 2001 From: manit2004 Date: Sat, 7 Nov 2026 20:41:38 +0530 Subject: [PATCH] fix: correct off-by-one in large-x series of math/base/special/gammainc --- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: skipped - task: lint_markdown_pkg_readmes status: na - task: lint_markdown_docs status: na - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: missing_dependencies - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed --- --- .../special/gammainc/lib/tgamma_i_large_x_series.js | 2 +- .../@stdlib/math/base/special/gammainc/src/main.c | 2 +- .../@stdlib/math/base/special/gammainc/test/test.js | 12 ++++++++++++ .../math/base/special/gammainc/test/test.native.js | 12 ++++++++++++ .../stats/base/dists/chisquare/cdf/test/test.cdf.js | 9 +++++++++ .../base/dists/chisquare/cdf/test/test.native.js | 9 +++++++++ .../stats/base/dists/poisson/cdf/test/test.cdf.js | 9 +++++++++ .../stats/base/dists/poisson/cdf/test/test.native.js | 9 +++++++++ 8 files changed, 62 insertions(+), 2 deletions(-) diff --git a/lib/node_modules/@stdlib/math/base/special/gammainc/lib/tgamma_i_large_x_series.js b/lib/node_modules/@stdlib/math/base/special/gammainc/lib/tgamma_i_large_x_series.js index 8d20922b8fd8..d7c4612334f9 100644 --- a/lib/node_modules/@stdlib/math/base/special/gammainc/lib/tgamma_i_large_x_series.js +++ b/lib/node_modules/@stdlib/math/base/special/gammainc/lib/tgamma_i_large_x_series.js @@ -44,7 +44,7 @@ */ function tgammaILargeXSeries( a1, x1 ) { var result = 1.0; - var a = a1; + var a = a1 - 1.0; var x = x1; return next; diff --git a/lib/node_modules/@stdlib/math/base/special/gammainc/src/main.c b/lib/node_modules/@stdlib/math/base/special/gammainc/src/main.c index 9740af505114..2ea097ec824d 100644 --- a/lib/node_modules/@stdlib/math/base/special/gammainc/src/main.c +++ b/lib/node_modules/@stdlib/math/base/special/gammainc/src/main.c @@ -700,7 +700,7 @@ static double sumSeries3( const double a, const double x ) { double sum; double ac; - ac = a; + ac = a - 1.0; sum = 0.0; result = 1.0; counter = MAX_ITERATIONS; diff --git a/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.js b/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.js index 1af976abb3b3..fb344b8e9109 100644 --- a/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.js +++ b/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.js @@ -464,3 +464,15 @@ tape( 'the function correctly evaluates the unregularized upper incomplete gamma } t.end(); }); + +tape( 'the function correctly evaluates the regularized incomplete gamma functions for large `x` when `s` is close to `x`', function test( t ) { + var actual; + + // NOTE: expected values were computed using arbitrary-precision arithmetic with 60 digits of precision. + actual = gammainc( 1367.3436948118986, 1409.203708740708 ); + t.strictEqual( ulpdiff( actual, 0.13190499189857088 ) <= 100, true, 'returns expected value within 100 ulp' ); + + actual = gammainc( 1001.0, 1000.5, true, true ); + t.strictEqual( ulpdiff( actual, 0.48949191460024505 ) <= 10, true, 'returns expected value within 10 ulp' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.native.js b/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.native.js index 9b0c32af0192..758fcbce2b61 100644 --- a/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.native.js +++ b/lib/node_modules/@stdlib/math/base/special/gammainc/test/test.native.js @@ -473,3 +473,15 @@ tape( 'the function correctly evaluates the unregularized upper incomplete gamma } t.end(); }); + +tape( 'the function correctly evaluates the regularized incomplete gamma functions for large `x` when `s` is close to `x`', opts, function test( t ) { + var actual; + + // NOTE: expected values were computed using arbitrary-precision arithmetic with 60 digits of precision. + actual = gammainc( 1367.3436948118986, 1409.203708740708, true, false ); + t.strictEqual( ulpdiff( actual, 0.13190499189857088 ) <= 100, true, 'returns expected value within 100 ulp' ); + + actual = gammainc( 1001.0, 1000.5, true, true ); + t.strictEqual( ulpdiff( actual, 0.48949191460024505 ) <= 10, true, 'returns expected value within 10 ulp' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.cdf.js b/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.cdf.js index 3c267d0a1aeb..41632ad69105 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.cdf.js +++ b/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.cdf.js @@ -116,3 +116,12 @@ tape( 'the function evaluates the cdf for `x` given degrees of freedom `k`', fun } t.end(); }); + +tape( 'the function evaluates the cdf for large `k` when `x` is close to `k`', function test( t ) { + var y; + + // NOTE: expected value was computed using arbitrary-precision arithmetic with 60 digits of precision. + y = cdf( 2500.0, 2400.0 ); + t.strictEqual( isAlmostSameValue( y, 0.9241270884571916, 10 ), true, 'returns expected value' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.native.js b/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.native.js index ec9facb81180..1ce3d24da9db 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.native.js +++ b/lib/node_modules/@stdlib/stats/base/dists/chisquare/cdf/test/test.native.js @@ -105,3 +105,12 @@ tape( 'the function evaluates the cdf for `x` given `k`', opts, function test( t } t.end(); }); + +tape( 'the function evaluates the cdf for large `k` when `x` is close to `k`', opts, function test( t ) { + var y; + + // NOTE: expected value was computed using arbitrary-precision arithmetic with 60 digits of precision. + y = cdf( 2500.0, 2400.0 ); + t.strictEqual( isAlmostSameValue( y, 0.9241270884571916, 10 ), true, 'returns expected value' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.cdf.js b/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.cdf.js index 7a67f80a7c50..606d78392951 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.cdf.js +++ b/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.cdf.js @@ -153,3 +153,12 @@ tape( 'the function evaluates the cdf for `x` given large parameter `lambda`', f } t.end(); }); + +tape( 'the function evaluates the cdf for large `lambda` when `x` is close to `lambda`', function test( t ) { + var y; + + // NOTE: expected value was computed using arbitrary-precision arithmetic with 60 digits of precision. + y = cdf( 999.0, 1001.0 ); + t.strictEqual( isAlmostSameValue( y, 0.4831885470702138, 30 ), true, 'returns expected value' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.native.js b/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.native.js index a77b8c76db2d..82fc59a21604 100644 --- a/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.native.js +++ b/lib/node_modules/@stdlib/stats/base/dists/poisson/cdf/test/test.native.js @@ -166,3 +166,12 @@ tape( 'the function evaluates the cdf for `x` given large parameter `lambda`', o } t.end(); }); + +tape( 'the function evaluates the cdf for large `lambda` when `x` is close to `lambda`', opts, function test( t ) { + var y; + + // NOTE: expected value was computed using arbitrary-precision arithmetic with 60 digits of precision. + y = cdf( 999.0, 1001.0 ); + t.strictEqual( isAlmostSameValue( y, 0.4831885470702138, 30 ), true, 'returns expected value' ); + t.end(); +});