Skip to content

Commit aa52ed9

Browse files
committed
fix: update implementation to preserve signed zeros
--- 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: passed - 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: na - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
1 parent 3d169cb commit aa52ed9

File tree

4 files changed

+58
-6
lines changed

4 files changed

+58
-6
lines changed

lib/node_modules/@stdlib/blas/ext/base/dsnansumors/lib/ndarray.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,34 @@ var isnan = require( '@stdlib/math/base/assert/is-nan' );
4545
function dsnansumors( N, x, strideX, offsetX ) {
4646
var sum;
4747
var ix;
48+
var v;
4849
var i;
4950

50-
sum = 0.0;
5151
if ( N <= 0 ) {
52-
return sum;
52+
return 0.0;
5353
}
5454
ix = offsetX;
5555
if ( strideX === 0 ) {
5656
if ( isnan( x[ ix ] ) ) {
57-
return sum;
57+
return 0.0;
5858
}
5959
return N * x[ ix ];
6060
}
61+
// Find the first non-NaN element...
6162
for ( i = 0; i < N; i++ ) {
63+
v = x[ ix ];
64+
if ( isnan( v ) === false ) {
65+
break;
66+
}
67+
ix += strideX;
68+
}
69+
if ( i === N ) {
70+
return 0.0;
71+
}
72+
sum = v;
73+
ix += strideX;
74+
i += 1;
75+
for ( ; i < N; i++ ) {
6276
if ( isnan( x[ ix ] ) === false ) {
6377
sum += x[ ix ];
6478
}

lib/node_modules/@stdlib/blas/ext/base/dsnansumors/src/main.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,33 @@ double API_SUFFIX(stdlib_strided_dsnansumors_ndarray)( const CBLAS_INT N, const
4747
CBLAS_INT ix;
4848
CBLAS_INT i;
4949
double sum;
50+
double v;
5051

51-
sum = 0.0;
5252
if ( N <= 0 ) {
53-
return sum;
53+
return 0.0;
5454
}
5555
ix = offsetX;
5656
if ( strideX == 0 ) {
5757
if ( stdlib_base_is_nanf( X[ ix ] ) ) {
58-
return sum;
58+
return 0.0;
5959
}
6060
return N * X[ ix ];
6161
}
62+
// Find the first non-NaN element...
6263
for ( i = 0; i < N; i++ ) {
64+
v = X[ ix ];
65+
if ( !stdlib_base_is_nanf( v ) ) {
66+
break;
67+
}
68+
ix += strideX;
69+
}
70+
if ( i == N ) {
71+
return 0.0;
72+
}
73+
sum = (double)v;
74+
ix += strideX;
75+
i += 1;
76+
for ( ; i < N; i++ ) {
6377
if ( !stdlib_base_is_nanf( X[ ix ] ) ) {
6478
sum += (double)X[ ix ];
6579
}

lib/node_modules/@stdlib/blas/ext/base/dsnansumors/test/test.ndarray.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
// MODULES //
2222

2323
var tape = require( 'tape' );
24+
var isNegativeZero = require( '@stdlib/math/base/assert/is-negative-zero' );
2425
var Float32Array = require( '@stdlib/array/float32' );
2526
var dsnansumors = require( './../lib/ndarray.js' );
2627

@@ -77,6 +78,17 @@ tape( 'the function calculates the sum of strided array elements (ignoring NaN v
7778
t.end();
7879
});
7980

81+
tape( 'the function preserves the sign of zero', function test( t ) {
82+
var x;
83+
var v;
84+
85+
x = new Float32Array( [ -0.0, -0.0, -0.0, -0.0, -0.0 ] );
86+
v = dsnansumors( x.length, x, 1, 0 );
87+
t.strictEqual( isNegativeZero( v ), true, 'returns expected value' );
88+
89+
t.end();
90+
});
91+
8092
tape( 'if provided an `N` parameter less than or equal to `0`, the function returns `0.0`', function test( t ) {
8193
var x;
8294
var v;

lib/node_modules/@stdlib/blas/ext/base/dsnansumors/test/test.ndarray.native.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
var resolve = require( 'path' ).resolve;
2424
var tape = require( 'tape' );
25+
var isNegativeZero = require( '@stdlib/math/base/assert/is-negative-zero' );
2526
var Float32Array = require( '@stdlib/array/float32' );
2627
var tryRequire = require( '@stdlib/utils/try-require' );
2728

@@ -86,6 +87,17 @@ tape( 'the function calculates the sum of strided array elements (ignoring NaN v
8687
t.end();
8788
});
8889

90+
tape( 'the function preserves the sign of zero', opts, function test( t ) {
91+
var x;
92+
var v;
93+
94+
x = new Float32Array( [ -0.0, -0.0, -0.0, -0.0, -0.0 ] );
95+
v = dsnansumors( x.length, x, 1, 0 );
96+
t.strictEqual( isNegativeZero( v ), true, 'returns expected value' );
97+
98+
t.end();
99+
});
100+
89101
tape( 'if provided an `N` parameter less than or equal to `0`, the function returns `0.0`', opts, function test( t ) {
90102
var x;
91103
var v;

0 commit comments

Comments
 (0)