Skip to content

Commit 7dd74a0

Browse files
committed
feat: enhance f32() wrapping consistency across float32 functions
--- 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 ---
1 parent f4a916c commit 7dd74a0

3 files changed

Lines changed: 65 additions & 83 deletions

File tree

lib/node_modules/@stdlib/math/base/special/exp2f/lib/main.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ var polyvalP = require( './polyval_p.js' );
4747
var polyvalQ = require( './polyval_q.js' );
4848

4949

50+
// VARIABLES //
51+
52+
var ONE = f32( 1.0 );
53+
54+
5055
// MAIN //
5156

5257
/**
@@ -99,10 +104,7 @@ function exp2f( x ) {
99104
var px;
100105
var xx;
101106
var n;
102-
103-
// Convert to float32 for proper single-precision behavior
104107
x = f32( x );
105-
106108
if ( isnanf( x ) ) {
107109
return x;
108110
}
@@ -114,15 +116,15 @@ function exp2f( x ) {
114116
}
115117
// Separate into integer and fractional parts...
116118
n = roundf( x );
117-
x -= n;
119+
x = f32( x - n );
118120

119-
xx = x * x;
120-
px = x * polyvalP( xx );
121-
x = px / ( polyvalQ( xx ) - px );
122-
x = 1.0 + ldexpf( x, 1 );
121+
xx = f32( x * x );
122+
px = f32( x * polyvalP( xx ) );
123+
x = f32( px / f32( polyvalQ( xx ) - px ) );
124+
x = f32( ONE + f32( ldexpf( x, 1 ) ) );
123125

124126
// Scale by power of 2:
125-
return ldexpf( x, n );
127+
return f32( ldexpf( x, n ) );
126128
}
127129

128130

lib/node_modules/@stdlib/math/base/special/exp2f/test/test.js

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222

2323
var tape = require( 'tape' );
2424
var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
25-
var absf = require( '@stdlib/math/base/special/absf' );
2625
var PINF = require( '@stdlib/constants/float32/pinf' );
2726
var NINF = require( '@stdlib/constants/float32/ninf' );
28-
var EPS = require( '@stdlib/constants/float32/eps' );
2927
var isPositiveZerof = require( '@stdlib/math/base/assert/is-positive-zerof' );
28+
var f32 = require( '@stdlib/number/float64/base/to-float32' );
29+
var isAlmostSameValue = require( '@stdlib/number/float32/base/assert/is-almost-same-value' );
3030
var exp2f = require( './../lib' );
3131

3232

@@ -49,100 +49,90 @@ tape( 'main export is a function', function test( t ) {
4949

5050
tape( 'the function accurately computes `2**x` for negative medium numbers', function test( t ) {
5151
var expected;
52-
var delta;
53-
var tol;
5452
var x;
55-
var v;
53+
var y;
5654
var i;
55+
var e;
5756

5857
x = mediumNegative.x;
5958
expected = mediumNegative.expected;
6059

6160
for ( i = 0; i < x.length; i++ ) {
62-
v = exp2f( x[ i ] );
63-
delta = absf( v - expected[ i ] );
64-
tol = 1.5 * EPS * absf( expected[ i ] );
65-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
61+
y = exp2f( x[ i ] );
62+
e = f32( expected[ i ] );
63+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
6664
}
6765
t.end();
6866
});
6967

7068
tape( 'the function accurately computes `2**x` for positive medium numbers', function test( t ) {
7169
var expected;
72-
var delta;
73-
var tol;
7470
var x;
75-
var v;
71+
var y;
7672
var i;
73+
var e;
7774

7875
x = mediumPositive.x;
7976
expected = mediumPositive.expected;
8077

8178
for ( i = 0; i < x.length; i++ ) {
82-
v = exp2f( x[ i ] );
83-
delta = absf( v - expected[ i ] );
84-
tol = 1.5 * EPS * absf( expected[ i ] );
85-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
79+
y = exp2f( x[ i ] );
80+
e = f32( expected[ i ] );
81+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
8682
}
8783
t.end();
8884
});
8985

9086
tape( 'the function accurately computes `2**x` for negative small numbers', function test( t ) {
9187
var expected;
92-
var delta;
93-
var tol;
9488
var x;
95-
var v;
89+
var y;
9690
var i;
91+
var e;
9792

9893
x = smallNegative.x;
9994
expected = smallNegative.expected;
10095

10196
for ( i = 0; i < x.length; i++ ) {
102-
v = exp2f( x[ i ] );
103-
delta = absf( v - expected[ i ] );
104-
tol = 1.5 * EPS * absf( expected[ i ] );
105-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
97+
y = exp2f( x[ i ] );
98+
e = f32( expected[ i ] );
99+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
106100
}
107101
t.end();
108102
});
109103

110104
tape( 'the function accurately computes `2**x` for positive small numbers', function test( t ) {
111105
var expected;
112-
var delta;
113-
var tol;
114106
var x;
115-
var v;
107+
var y;
116108
var i;
109+
var e;
117110

118111
x = smallPositive.x;
119112
expected = smallPositive.expected;
120113

121114
for ( i = 0; i < x.length; i++ ) {
122-
v = exp2f( x[ i ] );
123-
delta = absf( v - expected[ i ] );
124-
tol = 1.5 * EPS * absf( expected[ i ] );
125-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
115+
y = exp2f( x[ i ] );
116+
e = f32( expected[ i ] );
117+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
126118
}
127119
t.end();
128120
});
129121

130122
tape( 'the function accurately computes `2**x` for very small `x`', function test( t ) {
131123
var expected;
132-
var delta;
133-
var tol;
134124
var x;
135-
var v;
125+
var y;
136126
var i;
127+
var e;
137128

138129
x = tiny.x;
139130
expected = tiny.expected;
140131

141132
for ( i = 0; i < x.length; i++ ) {
142-
v = exp2f( x[ i ] );
143-
delta = absf( v - expected[ i ] );
144-
tol = 1.5 * EPS * absf( expected[ i ] );
145-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
133+
y = exp2f( x[ i ] );
134+
e = f32( expected[ i ] );
135+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
146136
}
147137
t.end();
148138
});

lib/node_modules/@stdlib/math/base/special/exp2f/test/test.native.js

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
var resolve = require( 'path' ).resolve;
2424
var tape = require( 'tape' );
2525
var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
26-
var absf = require( '@stdlib/math/base/special/absf' );
2726
var PINF = require( '@stdlib/constants/float32/pinf' );
2827
var NINF = require( '@stdlib/constants/float32/ninf' );
29-
var EPS = require( '@stdlib/constants/float32/eps' );
3028
var isPositiveZerof = require( '@stdlib/math/base/assert/is-positive-zerof' );
29+
var f32 = require( '@stdlib/number/float64/base/to-float32' );
30+
var isAlmostSameValue = require( '@stdlib/number/float32/base/assert/is-almost-same-value' );
3131
var tryRequire = require( '@stdlib/utils/try-require' );
3232

3333

@@ -58,100 +58,90 @@ tape( 'main export is a function', opts, function test( t ) {
5858

5959
tape( 'the function accurately computes `2**x` for negative medium numbers', opts, function test( t ) {
6060
var expected;
61-
var delta;
62-
var tol;
6361
var x;
64-
var v;
62+
var y;
6563
var i;
64+
var e;
6665

6766
x = mediumNegative.x;
6867
expected = mediumNegative.expected;
6968

7069
for ( i = 0; i < x.length; i++ ) {
71-
v = exp2f( x[ i ] );
72-
delta = absf( v - expected[ i ] );
73-
tol = 1.5 * EPS * absf( expected[ i ] );
74-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
70+
y = exp2f( x[ i ] );
71+
e = f32( expected[ i ] );
72+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
7573
}
7674
t.end();
7775
});
7876

7977
tape( 'the function accurately computes `2**x` for positive medium numbers', opts, function test( t ) {
8078
var expected;
81-
var delta;
82-
var tol;
8379
var x;
84-
var v;
80+
var y;
8581
var i;
82+
var e;
8683

8784
x = mediumPositive.x;
8885
expected = mediumPositive.expected;
8986

9087
for ( i = 0; i < x.length; i++ ) {
91-
v = exp2f( x[ i ] );
92-
delta = absf( v - expected[ i ] );
93-
tol = 1.5 * EPS * absf( expected[ i ] );
94-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
88+
y = exp2f( x[ i ] );
89+
e = f32( expected[ i ] );
90+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
9591
}
9692
t.end();
9793
});
9894

9995
tape( 'the function accurately computes `2**x` for negative small numbers', opts, function test( t ) {
10096
var expected;
101-
var delta;
102-
var tol;
10397
var x;
104-
var v;
98+
var y;
10599
var i;
100+
var e;
106101

107102
x = smallNegative.x;
108103
expected = smallNegative.expected;
109104

110105
for ( i = 0; i < x.length; i++ ) {
111-
v = exp2f( x[ i ] );
112-
delta = absf( v - expected[ i ] );
113-
tol = 1.5 * EPS * absf( expected[ i ] );
114-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
106+
y = exp2f( x[ i ] );
107+
e = f32( expected[ i ] );
108+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
115109
}
116110
t.end();
117111
});
118112

119113
tape( 'the function accurately computes `2**x` for positive small numbers', opts, function test( t ) {
120114
var expected;
121-
var delta;
122-
var tol;
123115
var x;
124-
var v;
116+
var y;
125117
var i;
118+
var e;
126119

127120
x = smallPositive.x;
128121
expected = smallPositive.expected;
129122

130123
for ( i = 0; i < x.length; i++ ) {
131-
v = exp2f( x[ i ] );
132-
delta = absf( v - expected[ i ] );
133-
tol = 1.5 * EPS * absf( expected[ i ] );
134-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
124+
y = exp2f( x[ i ] );
125+
e = f32( expected[ i ] );
126+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
135127
}
136128
t.end();
137129
});
138130

139131
tape( 'the function accurately computes `2**x` for very small `x`', opts, function test( t ) {
140132
var expected;
141-
var delta;
142-
var tol;
143133
var x;
144-
var v;
134+
var y;
145135
var i;
136+
var e;
146137

147138
x = tiny.x;
148139
expected = tiny.expected;
149140

150141
for ( i = 0; i < x.length; i++ ) {
151-
v = exp2f( x[ i ] );
152-
delta = absf( v - expected[ i ] );
153-
tol = 1.5 * EPS * absf( expected[ i ] );
154-
t.ok( delta <= tol, 'within tolerance. x: ' + x[ i ] + '. Value: ' + v + '. Expected: ' + expected[ i ] + '. Delta: ' + delta + '. Tolerance: ' + tol + '.' );
142+
y = exp2f( x[ i ] );
143+
e = f32( expected[ i ] );
144+
t.strictEqual( isAlmostSameValue( y, e, 3 ), true, 'x: '+x[i]+'. y: '+y+'. E: '+e+'.' );
155145
}
156146
t.end();
157147
});

0 commit comments

Comments
 (0)