-
-
Notifications
You must be signed in to change notification settings - Fork 751
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add math/base/special/exp2f
#3366
base: develop
Are you sure you want to change the base?
Conversation
/stdlib update-copyright-years |
Coverage Report
The above coverage report was generated for the changes in this PR. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your work on this PR! Looks great overall, but some changes will be needed for the JavaScript implementation.
In main.js
, we need to use the helper function
var float64ToFloat32 = require( '@stdlib/number/float64/base/to-float32' );
in order to ensure that all operations are done in a manner consistent with single-precision arithmetic. Recall that in JavaScript, all numbers are double-precision by default, so to emulate single-precision we must, in addition to using the single-precision variants of math functions, explicitly cast intermediate results and constants to single-precision floats.
good morning @Planeshifter! I've wrapped the intermediate results and final answers in |
Also, as mentioned in the questions section of the PR, what should i do about |
/stdlib update-copyright-years |
Signed-off-by: Gunj Joshi <gunjjoshi8372@gmail.com>
var randu = require( '@stdlib/random/base/randu' ); | ||
var exp2f = require( '@stdlib/math/base/special/exp2f' ); | ||
|
||
var x; | ||
var i; | ||
|
||
for ( i = 0; i < 100; i++ ) { | ||
x = ( randu() * 100.0 ) - 50.0; | ||
console.log( '2^%d = %d', x, exp2f( x ) ); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@aayush0325 We can use @stdlib/random/array/uniform
here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same can be followed in examples/index.js
too.
lib/node_modules/@stdlib/math/base/special/exp2f/benchmark/benchmark.native.js
Outdated
Show resolved
Hide resolved
lib/node_modules/@stdlib/math/base/special/exp2f/benchmark/benchmark.native.js
Outdated
Show resolved
Hide resolved
lib/node_modules/@stdlib/math/base/special/exp2f/benchmark/benchmark.native.js
Outdated
Show resolved
Hide resolved
lib/node_modules/@stdlib/math/base/special/exp2f/benchmark/benchmark.native.js
Outdated
Show resolved
Hide resolved
lib/node_modules/@stdlib/math/base/special/exp2f/benchmark/benchmark.native.js
Outdated
Show resolved
Hide resolved
lib/node_modules/@stdlib/math/base/special/exp2f/benchmark/benchmark.native.js
Outdated
Show resolved
Hide resolved
Signed-off-by: Gunj Joshi <gunjjoshi8372@gmail.com>
…chmark.native.js Signed-off-by: Gunj Joshi <gunjjoshi8372@gmail.com>
float y; | ||
double t; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
float y; | |
double t; | |
double t; | |
float y; |
* | ||
* @return random number | ||
*/ | ||
static double rand_float( void ) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
static double rand_float( void ) { | |
static float rand_float( void ) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We are returning a float
here.
double y; | ||
double t; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
double y; | |
double t; | |
double t; | |
float y; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
y
must be a float
, as exp2f
returns a float
, in L103.
int i; | ||
|
||
for ( i = 0; i < 10; i++ ) { | ||
x[ i ] = ( 240.0 * rand_float() ) - 120.0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing f
suffixes.
Evaluates the base 2 exponential function in | ||
single-precision floating-point format. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Evaluates the base 2 exponential function in | |
single-precision floating-point format. | |
Evaluates the base 2 exponential function in single-precision | |
floating-point format. |
float x; | ||
float v; | ||
int i; | ||
|
||
for ( i = 0; i < 100; i++ ) { | ||
x = ( ( (float)rand() / (float)RAND_MAX ) * 100.0f ) - 50.0f; | ||
v = stdlib_base_exp2f( x ); | ||
printf( "2^%f = %f\n", x, v ); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@aayush0325 We should be using tabs here, not spaces.
* | ||
* | arithmetic | domain | # trials | peak | rms | | ||
* |:----------:|:-----------:|:--------:|:-------:|:-------:| | ||
* | IEEE | -1022,+1024 | 30000 | 1.8e-16 | 5.4e-17 | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@aayush0325 These values for domain, number of trials, peak and rms are for the double-precision implementation, i.e., exp2
. You'll need to check the single-precision implementation and update these.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For instance, the domain for exp2f
will be restricted to -127,+127
, and not -1022,+1024
.
} | ||
// Separate into integer and fractional parts... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
} | |
// Separate into integer and fractional parts... | |
} | |
// Separate into integer and fractional parts... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Empty line before a comment.
return PINF; | ||
} | ||
if ( x < FLOAT32_MIN_BASE2_EXPONENT ) { | ||
return float64ToFloat32( 0.0 ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return float64ToFloat32( 0.0 ); | |
return 0.0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
0.0
can be returned directly here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@aayush0325 After L110, you'll need to add a conditional statement to return 1.0
if x is 0.0
. You might want to refer to the single-precision implementation (exp2f
) from cephes, as it is a bit different from porting exp2
directly to single-precision.
Progresses #649
Description
This pull request:
math/base/special/exp2f
Related Issues
This pull request:
Questions
What should i do about
benchmark/c/cephes
? that doesn't seem to compile locally and on the CI tests as well.Other
No.
Checklist
@stdlib-js/reviewers