Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
168 changes: 19 additions & 149 deletions lib/node_modules/@stdlib/math/base/special/ellipj/test/test.assign.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ var isnan = require( '@stdlib/math/base/assert/is-nan' );
var PINF = require( '@stdlib/constants/float64/pinf' );
var NINF = require( '@stdlib/constants/float64/ninf' );
var HALF_PI = require( '@stdlib/constants/float64/half-pi' );
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 ellipj = require( './../lib/assign.js' );


Expand Down Expand Up @@ -100,8 +99,6 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (medium po
var snExpected;
var cnExpected;
var dnExpected;
var delta;
var tol;
var sn;
var cn;
var dn;
Expand All @@ -124,29 +121,9 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (medium po
cn = y[1];
dn = y[2];

if ( sn === snExpected[i] ) {
t.strictEqual( sn, snExpected[i], 'u: '+u[i]+', m: '+m[i]+', sn: '+sn+', snExpected: '+snExpected[i] );
} else {
delta = abs( sn - snExpected[i] );
tol = 18.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', sn: '+sn+'. E: '+snExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( cn === cnExpected[i] ) {
t.strictEqual( cn, cnExpected[i], 'u: '+u[i]+', m: '+m[i]+', cn: '+cn+', cnExpected: '+cnExpected[i] );
} else {
delta = abs( cn - cnExpected[i] );
tol = 14.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', cn: '+cn+'. E: '+cnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( dn === dnExpected[i] ) {
t.strictEqual( dn, dnExpected[i], 'u: '+u[i]+', m: '+m[i]+', dn: '+dn+', dnExpected: '+dnExpected[i] );
} else {
delta = abs( dn - dnExpected[i] );
tol = 40.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', dn: '+dn+'. E: '+dnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}
t.strictEqual( isAlmostSameValue( sn, snExpected[i], 4750 ), true, 'returns expected value' );

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks off to me. How did we go from 18*EPS to 4750? I think you should double-check all these values.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kgryte, I ran a script to compute the actual ULP distance between the computed and fixture-expected values directly, rather than deriving it from the old EPS multiplier, for every value in every block.

All the outliers follow the same pattern: the absolute differences are in the 1e-15–1e-16 range, which is essentially a few units of double-precision floating-point noise. The relatively large ULP counts occur because these particular outputs are small in magnitude, where the representable gap between adjacent floating-point values is much finer.

Here’s the full breakdown:

Block ULP 1 ULP 2 ULP 3
Medium positive modulus 4750 9327 155
Modulus near unity 9944 12 12
Small positive modulus 9866 9792 1
Zero modulus 1 1 (exact - untouched)
Unity modulus 1 2 2

I also verified each of these outliers individually, and none appears to indicate an actual correctness issue.

Would you recommend that I add a short comment in the test file documenting why these higher ULP values occur, so the reasoning is clear for future reference?

t.strictEqual( isAlmostSameValue( cn, cnExpected[i], 9327 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( dn, dnExpected[i], 155 ), true, 'returns expected value' );
}
t.end();
});
Expand All @@ -155,8 +132,6 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (modulus n
var snExpected;
var cnExpected;
var dnExpected;
var delta;
var tol;
var sn;
var cn;
var dn;
Expand All @@ -179,29 +154,9 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (modulus n
cn = y[1];
dn = y[2];

if ( sn === snExpected[i] ) {
t.strictEqual( sn, snExpected[i], 'u: '+u[i]+', m: '+m[i]+', sn: '+sn+', snExpected: '+snExpected[i] );
} else {
delta = abs( sn - snExpected[i] );
tol = 7.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', sn: '+sn+'. E: '+snExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( cn === cnExpected[i] ) {
t.strictEqual( cn, cnExpected[i], 'u: '+u[i]+', m: '+m[i]+', cn: '+cn+', cnExpected: '+cnExpected[i] );
} else {
delta = abs( cn - cnExpected[i] );
tol = 5.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', cn: '+cn+'. E: '+cnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( dn === dnExpected[i] ) {
t.strictEqual( dn, dnExpected[i], 'u: '+u[i]+', m: '+m[i]+', dn: '+dn+', dnExpected: '+dnExpected[i] );
} else {
delta = abs( dn - dnExpected[i] );
tol = 5.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', dn: '+dn+'. E: '+dnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}
t.strictEqual( isAlmostSameValue( sn, snExpected[i], 9944 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( cn, cnExpected[i], 12 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( dn, dnExpected[i], 12 ), true, 'returns expected value' );
}
t.end();
});
Expand All @@ -210,8 +165,6 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (small pos
var snExpected;
var cnExpected;
var dnExpected;
var delta;
var tol;
var sn;
var cn;
var dn;
Expand All @@ -234,29 +187,9 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (small pos
cn = y[1];
dn = y[2];

if ( sn === snExpected[i] ) {
t.strictEqual( sn, snExpected[i], 'u: '+u[i]+', m: '+m[i]+', sn: '+sn+', snExpected: '+snExpected[i] );
} else {
delta = abs( sn - snExpected[i] );
tol = 12.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', sn: '+sn+'. E: '+snExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( cn === cnExpected[i] ) {
t.strictEqual( cn, cnExpected[i], 'u: '+u[i]+', m: '+m[i]+', cn: '+cn+', cnExpected: '+cnExpected[i] );
} else {
delta = abs( cn - cnExpected[i] );
tol = 12.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', cn: '+cn+'. E: '+cnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( dn === dnExpected[i] ) {
t.strictEqual( dn, dnExpected[i], 'u: '+u[i]+', m: '+m[i]+', dn: '+dn+', dnExpected: '+dnExpected[i] );
} else {
delta = abs( dn - dnExpected[i] );
tol = 1.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', dn: '+dn+'. E: '+dnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}
t.strictEqual( isAlmostSameValue( sn, snExpected[i], 9866 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( cn, cnExpected[i], 9792 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( dn, dnExpected[i], 1 ), true, 'returns expected value' );
}
t.end();
});
Expand All @@ -265,8 +198,6 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (zero modu
var snExpected;
var cnExpected;
var dnExpected;
var delta;
var tol;
var sn;
var cn;
var dn;
Expand All @@ -289,21 +220,8 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (zero modu
cn = y[1];
dn = y[2];

if ( sn === snExpected[i] ) {
t.strictEqual( sn, snExpected[i], 'u: '+u[i]+', m: '+m[i]+', sn: '+sn+', snExpected: '+snExpected[i] );
} else {
delta = abs( sn - snExpected[i] );
tol = 1.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', sn: '+sn+'. E: '+snExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( cn === cnExpected[i] ) {
t.strictEqual( cn, cnExpected[i], 'u: '+u[i]+', m: '+m[i]+', cn: '+cn+', cnExpected: '+cnExpected[i] );
} else {
delta = abs( cn - cnExpected[i] );
tol = 1.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', cn: '+cn+'. E: '+cnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}
t.strictEqual( isAlmostSameValue( sn, snExpected[i], 1 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( cn, cnExpected[i], 1 ), true, 'returns expected value' );

// There is no reason for this to be anything but exactly identical, i.e. 1.0.
t.strictEqual( dn, dnExpected[i], 'u: '+u[i]+', m: '+m[i]+', dn: '+dn+', dnExpected: '+dnExpected[i] );
Expand All @@ -315,8 +233,6 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (unity mod
var snExpected;
var cnExpected;
var dnExpected;
var delta;
var tol;
var sn;
var cn;
var dn;
Expand All @@ -339,29 +255,9 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (unity mod
cn = y[1];
dn = y[2];

if ( sn === snExpected[i] ) {
t.strictEqual( sn, snExpected[i], 'u: '+u[i]+', m: '+m[i]+', sn: '+sn+', snExpected: '+snExpected[i] );
} else {
delta = abs( sn - snExpected[i] );
tol = 1.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', sn: '+sn+'. E: '+snExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( cn === cnExpected[i] ) {
t.strictEqual( cn, cnExpected[i], 'u: '+u[i]+', m: '+m[i]+', cn: '+cn+', cnExpected: '+cnExpected[i] );
} else {
delta = abs( cn - cnExpected[i] );
tol = 1.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', cn: '+cn+'. E: '+cnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( dn === dnExpected[i] ) {
t.strictEqual( dn, dnExpected[i], 'u: '+u[i]+', m: '+m[i]+', dn: '+dn+', dnExpected: '+dnExpected[i] );
} else {
delta = abs( dn - dnExpected[i] );
tol = 1.0 * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', dn: '+dn+'. E: '+dnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}
t.strictEqual( isAlmostSameValue( sn, snExpected[i], 1 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( cn, cnExpected[i], 2 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( dn, dnExpected[i], 2 ), true, 'returns expected value' );
}
t.end();
});
Expand All @@ -372,8 +268,6 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (spot chec
var dnExpected;
var amExpected;
var tolerance;
var delta;
var tol;
var sn;
var cn;
var dn;
Expand Down Expand Up @@ -401,38 +295,14 @@ tape( 'the function evaluates the Jacobi elliptic functions sn, cn dn (spot chec

tolerance = spotChecks.tolerance[ i ];

if ( sn === snExpected[i] ) {
t.strictEqual( sn, snExpected[i], 'u: '+u[i]+', m: '+m[i]+', sn: '+sn+', snExpected: '+snExpected[i] );
} else {
delta = abs( sn - snExpected[i] );
tol = tolerance * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', sn: '+sn+'. E: '+snExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( cn === cnExpected[i] ) {
t.strictEqual( cn, cnExpected[i], 'u: '+u[i]+', m: '+m[i]+', cn: '+cn+', cnExpected: '+cnExpected[i] );
} else {
delta = abs( cn - cnExpected[i] );
tol = tolerance * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', cn: '+cn+'. E: '+cnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}

if ( dn === dnExpected[i] ) {
t.strictEqual( dn, dnExpected[i], 'u: '+u[i]+', m: '+m[i]+', dn: '+dn+', dnExpected: '+dnExpected[i] );
} else {
delta = abs( dn - dnExpected[i] );
tol = tolerance * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', dn: '+dn+'. E: '+dnExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
}
t.strictEqual( isAlmostSameValue( sn, snExpected[i], 154 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( cn, cnExpected[i], 986545 ), true, 'returns expected value' );
t.strictEqual( isAlmostSameValue( dn, dnExpected[i], 986506 ), true, 'returns expected value' );

if ( amExpected[i] === null ) {
t.strictEqual( isnan(am), true, 'is NaN. u: '+u[i]+'. m: '+m[i]+', am: '+am+'.' );
} else if ( am === amExpected[i] ) {
t.strictEqual( am, amExpected[i], 'u: '+u[i]+', m: '+m[i]+', am: '+am+', amExpected: '+amExpected[i] );
} else {
delta = abs( am - amExpected[i] );
tol = tolerance * EPS;
t.strictEqual( delta <= tol, true, 'within tolerance. u: '+u[i]+'. m: '+m[i]+', am: '+am+'. E: '+amExpected[i]+'. Δ: '+delta+'. tol: '+tol+'.' );
t.strictEqual( isAlmostSameValue( am, amExpected[i], tolerance ), true, 'returns expected value' );
}
}
t.end();
Expand Down
Loading