From a1b2f61a6707170b1083cd56f08c2825fe10abd9 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 12 Aug 2026 02:17:38 +0000 Subject: [PATCH] test: migrate `math/base/special/factorial` to ULP-based assertions Replace relative tolerance assertions with ULP-based assertions using `@stdlib/assert/is-almost-same-value`. The ULP bounds were empirically tightened to the minimum passing values over the full fixture sets: 1 ULP for the integer fixtures and 6 ULP for the decimal fixtures. Both the JavaScript and C implementations require identical bounds. Ref: https://github.com/stdlib-js/stdlib/issues/11352 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01LG6eNsViEh6xK1Ms4x2tGr --- .../math/base/special/factorial/test/test.js | 19 +++---------------- .../special/factorial/test/test.native.js | 19 +++---------------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/lib/node_modules/@stdlib/math/base/special/factorial/test/test.js b/lib/node_modules/@stdlib/math/base/special/factorial/test/test.js index a06d1c20a060..40949318d0f1 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial/test/test.js +++ b/lib/node_modules/@stdlib/math/base/special/factorial/test/test.js @@ -21,12 +21,11 @@ // MODULES // var tape = require( 'tape' ); +var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var incrspace = require( '@stdlib/array/base/incrspace' ); -var abs = require( '@stdlib/math/base/special/abs' ); var PINF = require( '@stdlib/constants/float64/pinf' ); var NINF = require( '@stdlib/constants/float64/ninf' ); -var EPS = require( '@stdlib/constants/float64/eps' ); var factorial = require( './../lib' ); @@ -103,8 +102,6 @@ tape( 'if `x < -171.56749...`, the function returns zero', function test( t ) { tape( 'the function evaluates the factorial function (positive integers < 171)', function test( t ) { var expected; - var delta; - var tol; var x; var v; var i; @@ -113,13 +110,7 @@ tape( 'the function evaluates the factorial function (positive integers < 171)', expected = integers.expected; for ( i = 0; i < x.length; i++ ) { v = factorial( x[ i ] ); - if ( v === expected[ i ] ) { - t.strictEqual( v, expected[ i ], 'returns '+expected[i]+' when provided '+x[i] ); - } else { - delta = abs( v - expected[ i ] ); - tol = EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Tolerance: ' + tol + '. Delta: ' + delta + '.' ); - } + t.strictEqual( isAlmostSameValue( v, expected[ i ], 1 ), true, 'returns expected value' ); } t.end(); }); @@ -136,8 +127,6 @@ tape( 'if provided positive integers greater than `170`, the function returns po tape( 'the function evaluates the factorial function (decimal values)', function test( t ) { var expected; - var delta; - var tol; var x; var v; var i; @@ -146,9 +135,7 @@ tape( 'the function evaluates the factorial function (decimal values)', function expected = decimals.expected; for ( i = 0; i < x.length; i++ ) { v = factorial( x[ i ] ); - delta = abs( v - expected[ i ] ); - tol = 3.5 * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Tolerance: ' + tol + '. Delta: ' + delta + '.' ); + t.strictEqual( isAlmostSameValue( v, expected[ i ], 6 ), true, 'returns expected value' ); } t.end(); }); diff --git a/lib/node_modules/@stdlib/math/base/special/factorial/test/test.native.js b/lib/node_modules/@stdlib/math/base/special/factorial/test/test.native.js index e9adcfc339b8..c626c6693b6f 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial/test/test.native.js +++ b/lib/node_modules/@stdlib/math/base/special/factorial/test/test.native.js @@ -22,12 +22,11 @@ var resolve = require( 'path' ).resolve; var tape = require( 'tape' ); +var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var incrspace = require( '@stdlib/array/base/incrspace' ); -var abs = require( '@stdlib/math/base/special/abs' ); var PINF = require( '@stdlib/constants/float64/pinf' ); var NINF = require( '@stdlib/constants/float64/ninf' ); -var EPS = require( '@stdlib/constants/float64/eps' ); var tryRequire = require( '@stdlib/utils/try-require' ); @@ -112,8 +111,6 @@ tape( 'if `x < -171.56749...`, the function returns zero', opts, function test( tape( 'the function evaluates the factorial function (positive integers < 171)', opts, function test( t ) { var expected; - var delta; - var tol; var x; var v; var i; @@ -122,13 +119,7 @@ tape( 'the function evaluates the factorial function (positive integers < 171)', expected = integers.expected; for ( i = 0; i < x.length; i++ ) { v = factorial( x[ i ] ); - if ( v === expected[ i ] ) { - t.strictEqual( v, expected[ i ], 'returns '+expected[i]+' when provided '+x[i] ); - } else { - delta = abs( v - expected[ i ] ); - tol = EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Tolerance: ' + tol + '. Delta: ' + delta + '.' ); - } + t.strictEqual( isAlmostSameValue( v, expected[ i ], 1 ), true, 'returns expected value' ); } t.end(); }); @@ -145,8 +136,6 @@ tape( 'if provided positive integers greater than `170`, the function returns po tape( 'the function evaluates the factorial function (decimal values)', opts, function test( t ) { var expected; - var delta; - var tol; var x; var v; var i; @@ -155,9 +144,7 @@ tape( 'the function evaluates the factorial function (decimal values)', opts, fu expected = decimals.expected; for ( i = 0; i < x.length; i++ ) { v = factorial( x[ i ] ); - delta = abs( v - expected[ i ] ); - tol = 3.5 * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Tolerance: ' + tol + '. Delta: ' + delta + '.' ); + t.strictEqual( isAlmostSameValue( v, expected[ i ], 6 ), true, 'returns expected value' ); } t.end(); });