From 1b687a2c3784a6554cf9705d276131fa4c424b81 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 22 Oct 2026 10:21:32 +0000 Subject: [PATCH] test: migrate `blas/base/dnrm2` to ULP-based assertions Replaces the relative-tolerance `isApprox` helper in the `blas/base/dnrm2` tests with ULP-based assertions using `@stdlib/assert/is-almost-same-value`. The `isApprox` helper was dead code: every call site passed scalars rather than collections, so `expected.length` was `undefined` and the comparison loop never executed. The three expected values the dead loop masked are corrected to the correctly rounded double-precision L2-norms, computed independently of the implementation via exact rational arithmetic. All bounds are the measured minimum (0 ULP). Resolves a part of #11352. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01QCQbTw5Lv9JisHVani41ZR --- .../blas/base/dnrm2/test/test.dnrm2.js | 38 ++----------------- .../blas/base/dnrm2/test/test.dnrm2.native.js | 38 ++----------------- .../blas/base/dnrm2/test/test.ndarray.js | 38 ++----------------- .../base/dnrm2/test/test.ndarray.native.js | 38 ++----------------- 4 files changed, 16 insertions(+), 136 deletions(-) diff --git a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.js b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.js index 526169a16a72..a88e9022ff6c 100644 --- a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.js +++ b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.js @@ -23,40 +23,10 @@ var tape = require( 'tape' ); var sqrt = require( '@stdlib/math/base/special/sqrt' ); var Float64Array = require( '@stdlib/array/float64' ); -var EPS = require( '@stdlib/constants/float64/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' ); var dnrm2 = require( './../lib/dnrm2.js' ); -// FUNCTIONS // - -/** -* Tests for element-wise approximate equality. -* -* @private -* @param {Object} t - test object -* @param {Collection} actual - actual values -* @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance -*/ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; - var i; - - t.strictEqual( actual.length, expected.length, 'returns expected value' ); - for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } - } -} - - // TESTS // tape( 'main export is a function', function test( t ) { @@ -99,17 +69,17 @@ tape( 'the function calculates the L2-norm of a vector', function test( t ) { x = new Float64Array( [ 1.0e150, 1.0e50, 1.0e150, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e150, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.414213562373095e150, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.0e-155, 1.0e50, 1.0e-155, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e50, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.4142135623730952e50, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.4e-154, 1.5e-154, 1.4e-154, 0.0 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 2.4839480006885204e-154, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 2.4839484696748444e-154, 0 ), true, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.native.js b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.native.js index 0b265ce7667f..76f517866ec4 100644 --- a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.native.js +++ b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.dnrm2.native.js @@ -24,8 +24,7 @@ var resolve = require( 'path' ).resolve; var tape = require( 'tape' ); var sqrt = require( '@stdlib/math/base/special/sqrt' ); var Float64Array = require( '@stdlib/array/float64' ); -var EPS = require( '@stdlib/constants/float64/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' ); var tryRequire = require( '@stdlib/utils/try-require' ); @@ -37,35 +36,6 @@ var opts = { }; -// FUNCTIONS // - -/** -* Tests for element-wise approximate equality. -* -* @private -* @param {Object} t - test object -* @param {Collection} actual - actual values -* @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance -*/ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; - var i; - - t.strictEqual( actual.length, expected.length, 'returns expected value' ); - for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } - } -} - - // TESTS // tape( 'main export is a function', opts, function test( t ) { @@ -106,17 +76,17 @@ tape( 'the function calculates the L2-norm of a vector', opts, function test( t x = new Float64Array( [ 1.0e150, 1.0e50, 1.0e150, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e150, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.414213562373095e150, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.0e-155, 1.0e50, 1.0e-155, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e50, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.4142135623730952e50, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.4e-154, 1.5e-154, 1.4e-154, 0.0 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 2.4839480006885204e-154, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 2.4839484696748444e-154, 0 ), true, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.js b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.js index d006f32794ea..7c6f1f6f3f17 100644 --- a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.js +++ b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.js @@ -23,40 +23,10 @@ var tape = require( 'tape' ); var sqrt = require( '@stdlib/math/base/special/sqrt' ); var Float64Array = require( '@stdlib/array/float64' ); -var EPS = require( '@stdlib/constants/float64/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' ); var dnrm2 = require( './../lib/ndarray.js' ); -// FUNCTIONS // - -/** -* Tests for element-wise approximate equality. -* -* @private -* @param {Object} t - test object -* @param {Collection} actual - actual values -* @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance -*/ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; - var i; - - t.strictEqual( actual.length, expected.length, 'returns expected value' ); - for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } - } -} - - // TESTS // tape( 'main export is a function', function test( t ) { @@ -97,17 +67,17 @@ tape( 'the function calculates the L2-norm of a vector', function test( t ) { x = new Float64Array( [ 1.0e150, 1.0e50, 1.0e150, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e150, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.414213562373095e150, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.0e-155, 1.0e50, 1.0e-155, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e50, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.4142135623730952e50, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.4e-154, 1.5e-154, 1.4e-154, 0.0 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 2.4839480006885204e-154, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 2.4839484696748444e-154, 0 ), true, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.native.js b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.native.js index bef281bbf0ce..9afdcdc6d30b 100644 --- a/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.native.js +++ b/lib/node_modules/@stdlib/blas/base/dnrm2/test/test.ndarray.native.js @@ -24,8 +24,7 @@ var resolve = require( 'path' ).resolve; var tape = require( 'tape' ); var sqrt = require( '@stdlib/math/base/special/sqrt' ); var Float64Array = require( '@stdlib/array/float64' ); -var EPS = require( '@stdlib/constants/float64/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValue = require( '@stdlib/assert/is-almost-same-value' ); var tryRequire = require( '@stdlib/utils/try-require' ); @@ -37,35 +36,6 @@ var opts = { }; -// FUNCTIONS // - -/** -* Tests for element-wise approximate equality. -* -* @private -* @param {Object} t - test object -* @param {Collection} actual - actual values -* @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance -*/ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; - var i; - - t.strictEqual( actual.length, expected.length, 'returns expected value' ); - for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } - } -} - - // TESTS // tape( 'main export is a function', opts, function test( t ) { @@ -106,17 +76,17 @@ tape( 'the function calculates the L2-norm of a vector', opts, function test( t x = new Float64Array( [ 1.0e150, 1.0e50, 1.0e150, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e150, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.414213562373095e150, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.0e-155, 1.0e50, 1.0e-155, 1.0e50 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 1.4142135623730951e50, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 1.4142135623730952e50, 0 ), true, 'returns expected value' ); x = new Float64Array( [ 1.4e-154, 1.5e-154, 1.4e-154, 0.0 ] ); z = dnrm2( x.length, x, 1, 0 ); - isApprox( t, z, 2.4839480006885204e-154, 1.0 ); + t.strictEqual( isAlmostSameValue( z, 2.4839484696748444e-154, 0 ), true, 'returns expected value' ); t.end(); });