From 2b1e266c7563f889b6fc5e778a53de9781f8a8f7 Mon Sep 17 00:00:00 2001 From: Abdul Kaium Date: Wed, 22 Apr 2026 01:27:04 +0600 Subject: [PATCH 1/5] bench: update random number generation in `number/uint32/base/muldw` --- .../uint32/base/muldw/benchmark/benchmark.js | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/node_modules/@stdlib/number/uint32/base/muldw/benchmark/benchmark.js b/lib/node_modules/@stdlib/number/uint32/base/muldw/benchmark/benchmark.js index 2a1258a668f9..0cceb25b7f8d 100644 --- a/lib/node_modules/@stdlib/number/uint32/base/muldw/benchmark/benchmark.js +++ b/lib/node_modules/@stdlib/number/uint32/base/muldw/benchmark/benchmark.js @@ -21,7 +21,7 @@ // MODULES // var bench = require( '@stdlib/bench' ); -var minstd = require( '@stdlib/random/base/minstd' ); +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var format = require( '@stdlib/string/format' ); var pkg = require( './../package.json' ).name; @@ -33,12 +33,17 @@ var umuldw = require( './../lib' ); bench( pkg, function benchmark( b ) { var x; var y; + var z; var i; + x = discreteUniform( 100, 0x10000, 0x10000000, { + 'dtype': 'uint32' + }); + b.tic(); for ( i = 0; i < b.iterations; i++ ) { - x = minstd(); - y = umuldw( x, x ); + z = x[ i%x.length ]; + y = umuldw( z, z ); if ( isnan( y[0] ) ) { b.fail( 'should not return NaN' ); } @@ -55,14 +60,19 @@ bench( format( '%s:assign', pkg ), function benchmark( b ) { var out; var x; var y; + var z; var i; - out = [ 0.0, 0.0]; + x = discreteUniform( 100, 0x10000, 0x10000000, { + 'dtype': 'uint32' + }); + + out = [ 0.0, 0.0 ]; b.tic(); for ( i = 0; i < b.iterations; i++ ) { - x = minstd(); - y = umuldw.assign( x, x, out, 1, 0 ); + z = x[ i%x.length ]; + y = umuldw.assign( z, z, out, 1, 0 ); if ( isnan( y[0] ) ) { b.fail( 'should not return NaN' ); } From e8bffef882fe91ce32e5ced4e800c7d69e4ad72b Mon Sep 17 00:00:00 2001 From: Abdul Kaium Date: Wed, 22 Apr 2026 01:49:09 +0600 Subject: [PATCH 2/5] refactor: move `isnan` check from assign.js into main.js and utilize `umul` --- 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: passed - 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: na - 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 --- --- .../number/uint32/base/muldw/lib/assign.js | 11 ++------ .../number/uint32/base/muldw/lib/main.js | 5 ++++ .../uint32/base/muldw/test/test.assign.js | 26 ------------------- 3 files changed, 7 insertions(+), 35 deletions(-) diff --git a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js index 86c1445e4bf4..05fc0810ca5c 100644 --- a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js +++ b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js @@ -20,7 +20,7 @@ // MODULES // -var isnan = require( '@stdlib/math/base/assert/is-nan' ); +var umul = require( '@stdlib/number/uint32/base/mul' ); // VARIABLES // @@ -49,7 +49,6 @@ var LOW_WORD_MASK = 0x0000ffff>>>0; // asm type annotation function umuldw(a, b, out, stride, offset ) { var w1; var w2; - var w3; var ha; var hb; var la; @@ -57,11 +56,6 @@ function umuldw(a, b, out, stride, offset ) { var t; var k; - if ( isnan( a ) || isnan( b ) ) { - out[ offset ] = NaN; - out[ offset + stride ] = NaN; - return out; - } a >>>= 0; // asm type annotation b >>>= 0; // asm type annotation @@ -72,7 +66,6 @@ function umuldw(a, b, out, stride, offset ) { lb = ( b & LOW_WORD_MASK ) >>> 0; t = ( la*lb ) >>> 0; - w3 = ( t & LOW_WORD_MASK ) >>> 0; k = ( t >>> 16 ) >>> 0; t = ( ( ha*lb ) + k ) >>> 0; @@ -83,7 +76,7 @@ function umuldw(a, b, out, stride, offset ) { k = ( t >>> 16 ) >>> 0; out[ offset ] = ( ( ha*hb ) + w1 + k ) >>> 0; // compute the higher 32 bits and cast to an unsigned 32-bit integer - out[ offset + stride ] = ( ( t << 16 ) + w3) >>> 0; // compute the lower 32 bits and cast to an unsigned 32-bit integer + out[ offset + stride ] = umul(a, b) >>> 0; // compute the lower 32 bits and cast to an unsigned 32-bit integer return out; } diff --git a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js index c6553fd42012..e65fee33acbd 100644 --- a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js +++ b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js @@ -20,6 +20,7 @@ // MODULES // +var isnan = require( '@stdlib/math/base/assert/is-nan' ); var fcn = require( './assign.js' ); @@ -37,6 +38,10 @@ var fcn = require( './assign.js' ); * // returns [ 954437176, 1908874354 ] */ function umuldw( a, b ) { + if ( isnan( a ) || isnan( b ) ) { + return [ NaN, NaN ]; + } + return fcn( a, b, [ 0, 0 ], 1, 0 ); } diff --git a/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.assign.js b/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.assign.js index 084332c020a0..e26ba0b8aca4 100644 --- a/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.assign.js +++ b/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.assign.js @@ -21,7 +21,6 @@ // MODULES // var tape = require( 'tape' ); -var isnan = require( '@stdlib/math/base/assert/is-nan' ); var Float64Array = require( '@stdlib/array/float64' ); var umuldw = require( './../lib/assign.js' ); @@ -39,31 +38,6 @@ tape( 'main export is a function', function test( t ) { t.end(); }); -tape( 'the function returns `NaN` if provided `NaN`', function test( t ) { - var out; - var v; - - out = [ 0, 0 ]; - v = umuldw( NaN, 1, out, 1, 0 ); - t.strictEqual( v, out, 'returns output array' ); - t.strictEqual( isnan( v[0] ), true, 'returns expected value' ); - t.strictEqual( isnan( v[1] ), true, 'returns expected value' ); - - out = [ 0, 0 ]; - v = umuldw( 1, NaN, out, 1, 0 ); - t.strictEqual( v, out, 'returns output array' ); - t.strictEqual( isnan( v[0] ), true, 'returns expected value' ); - t.strictEqual( isnan( v[1] ), true, 'returns expected value' ); - - out = [ 0, 0 ]; - v = umuldw( NaN, NaN, out, 1, 0 ); - t.strictEqual( v, out, 'returns output array' ); - t.strictEqual( isnan( v[0] ), true, 'returns expected value' ); - t.strictEqual( isnan( v[1] ), true, 'returns expected value' ); - - t.end(); -}); - tape( 'the function computes the double word product of two (unsigned) words', function test( t ) { var expected; var actual; From 311d2e2ead2c156d90f3934ec9414f17ea8432c9 Mon Sep 17 00:00:00 2001 From: Athan Date: Tue, 21 Apr 2026 16:47:15 -0700 Subject: [PATCH 3/5] Apply suggestions from code review Co-authored-by: Athan Signed-off-by: Athan --- lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js index 05fc0810ca5c..5273cae0c8fb 100644 --- a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js +++ b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/assign.js @@ -76,7 +76,7 @@ function umuldw(a, b, out, stride, offset ) { k = ( t >>> 16 ) >>> 0; out[ offset ] = ( ( ha*hb ) + w1 + k ) >>> 0; // compute the higher 32 bits and cast to an unsigned 32-bit integer - out[ offset + stride ] = umul(a, b) >>> 0; // compute the lower 32 bits and cast to an unsigned 32-bit integer + out[ offset + stride ] = umul( a, b ) >>> 0; // compute the lower 32 bits and cast to an unsigned 32-bit integer return out; } From acec49897d2d55fd80cb92713a5f600b1263e803 Mon Sep 17 00:00:00 2001 From: Athan Date: Wed, 22 Apr 2026 02:27:27 -0700 Subject: [PATCH 4/5] Apply suggestions from code review Co-authored-by: Athan Signed-off-by: Athan --- .../@stdlib/number/uint32/base/muldw/lib/main.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js index e65fee33acbd..c6553fd42012 100644 --- a/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js +++ b/lib/node_modules/@stdlib/number/uint32/base/muldw/lib/main.js @@ -20,7 +20,6 @@ // MODULES // -var isnan = require( '@stdlib/math/base/assert/is-nan' ); var fcn = require( './assign.js' ); @@ -38,10 +37,6 @@ var fcn = require( './assign.js' ); * // returns [ 954437176, 1908874354 ] */ function umuldw( a, b ) { - if ( isnan( a ) || isnan( b ) ) { - return [ NaN, NaN ]; - } - return fcn( a, b, [ 0, 0 ], 1, 0 ); } From 16574b5023c20294aab88ee5df288b29ec2a98d8 Mon Sep 17 00:00:00 2001 From: Abdul Kaium Date: Wed, 22 Apr 2026 16:52:28 +0600 Subject: [PATCH 5/5] test: remove isnan checks from test.main.js --- 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: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: na - 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: na - 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 --- --- .../uint32/base/muldw/test/test.main.js | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.main.js b/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.main.js index ff5c1efdda7e..059b517aecdb 100644 --- a/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.main.js +++ b/lib/node_modules/@stdlib/number/uint32/base/muldw/test/test.main.js @@ -21,7 +21,6 @@ // MODULES // var tape = require( 'tape' ); -var isnan = require( '@stdlib/math/base/assert/is-nan' ); var umuldw = require( './../lib/main.js' ); @@ -38,24 +37,6 @@ tape( 'main export is a function', function test( t ) { t.end(); }); -tape( 'the function returns `NaN` if provided `NaN`', function test( t ) { - var v; - - v = umuldw( NaN, 1 ); - t.strictEqual( isnan( v[0] ), true, 'returns expected value' ); - t.strictEqual( isnan( v[1] ), true, 'returns expected value' ); - - v = umuldw( 1, NaN ); - t.strictEqual( isnan( v[0] ), true, 'returns expected value' ); - t.strictEqual( isnan( v[1] ), true, 'returns expected value' ); - - v = umuldw( NaN, NaN ); - t.strictEqual( isnan( v[0] ), true, 'returns expected value' ); - t.strictEqual( isnan( v[1] ), true, 'returns expected value' ); - - t.end(); -}); - tape( 'the function computes the double word product of two (unsigned) words', function test( t ) { var expected; var actual;