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 22a6a4b1316c..526169a16a72 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,9 +23,40 @@ 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 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 ) { @@ -53,6 +84,33 @@ tape( 'the function calculates the L2-norm of a vector', function test( t ) { z = dnrm2( x.length, x, 1 ); t.strictEqual( z, 4.0, 'returns expected value' ); + x = new Float64Array( [ 1.0e150, 1.0e150, 1.0e150, 1.0e150 ] ); + + z = dnrm2( x.length, x, 1 ); + t.strictEqual( z, 2.0e+150, 'returns expected value' ); + + x = new Float64Array( [ 1.0e-155, 1.0e-155, 1.0e-155, 1.0e-155 ] ); + + z = dnrm2( x.length, x, 1 ); + t.strictEqual( z, 2.0e-155, 'returns expected value' ); + + x = new Float64Array( [ 1.0e150, 1.0e50, 1.0e150, 1.0e50 ] ); + + 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 ); + + 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 ); + + 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.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 9441031a1b28..0b265ce7667f 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,6 +24,8 @@ 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 tryRequire = require( '@stdlib/utils/try-require' ); @@ -35,6 +37,35 @@ 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 ) { @@ -62,6 +93,31 @@ tape( 'the function calculates the L2-norm of a vector', opts, function test( t z = dnrm2( x.length, x, 1 ); t.strictEqual( z, 4.0, 'returns expected value' ); + x = new Float64Array( [ 1.0e150, 1.0e150, 1.0e150, 1.0e150 ] ); + + z = dnrm2( x.length, x, 1 ); + t.strictEqual( z, 2.0e+150, 'returns expected value' ); + + x = new Float64Array( [ 1.0e-155, 1.0e-155, 1.0e-155, 1.0e-155 ] ); + + z = dnrm2( x.length, x, 1 ); + t.strictEqual( z, 2.0e-155, 'returns expected value' ); + + 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 ); + + 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 ); + + 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.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 1962dcf9419e..d006f32794ea 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,9 +23,40 @@ 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 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 ) { @@ -53,6 +84,31 @@ tape( 'the function calculates the L2-norm of a vector', function test( t ) { z = dnrm2( x.length, x, 1, 0 ); t.strictEqual( z, 4.0, 'returns expected value' ); + x = new Float64Array( [ 1.0e150, 1.0e150, 1.0e150, 1.0e150 ] ); + + z = dnrm2( x.length, x, 1, 0 ); + t.strictEqual( z, 2.0e+150, 'returns expected value' ); + + x = new Float64Array( [ 1.0e-155, 1.0e-155, 1.0e-155, 1.0e-155 ] ); + + z = dnrm2( x.length, x, 1, 0 ); + t.strictEqual( z, 2.0e-155, 'returns expected value' ); + + 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 ); + + 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 ); + + 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.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 541af646c82e..bef281bbf0ce 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,6 +24,8 @@ 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 tryRequire = require( '@stdlib/utils/try-require' ); @@ -35,6 +37,35 @@ 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 ) { @@ -62,6 +93,31 @@ tape( 'the function calculates the L2-norm of a vector', opts, function test( t z = dnrm2( x.length, x, 1, 0 ); t.strictEqual( z, 4.0, 'returns expected value' ); + x = new Float64Array( [ 1.0e150, 1.0e150, 1.0e150, 1.0e150 ] ); + + z = dnrm2( x.length, x, 1, 0 ); + t.strictEqual( z, 2.0e+150, 'returns expected value' ); + + x = new Float64Array( [ 1.0e-155, 1.0e-155, 1.0e-155, 1.0e-155 ] ); + + z = dnrm2( x.length, x, 1, 0 ); + t.strictEqual( z, 2.0e-155, 'returns expected value' ); + + 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 ); + + 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 ); + + 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.end(); });