Skip to content

Commit 9f18c66

Browse files
committed
feat: add math/base/special/truncsdf
--- 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: na - task: lint_javascript_benchmarks status: passed - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: missing_dependencies - 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 a8d0304 commit 9f18c66

2 files changed

Lines changed: 42 additions & 41 deletions

File tree

lib/node_modules/@stdlib/math/base/special/truncsdf/manifest.json

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@
4545
"@stdlib/math/base/special/abs",
4646
"@stdlib/math/base/special/floor",
4747
"@stdlib/math/base/special/trunc",
48-
"@stdlib/number/float32/base/exponent",
49-
"@stdlib/number/float64/base/to-float32"
48+
"@stdlib/number/float32/base/exponent"
5049
]
5150
},
5251
{
@@ -60,14 +59,14 @@
6059
"libraries": [],
6160
"libpath": [],
6261
"dependencies": [
63-
"@stdlib/math/base/assert/is-nanf",
64-
"@stdlib/math/base/assert/is-infinitef",
65-
"@stdlib/math/base/special/powf",
66-
"@stdlib/math/base/special/log10f",
67-
"@stdlib/math/base/special/lnf",
68-
"@stdlib/math/base/special/absf",
69-
"@stdlib/math/base/special/floorf",
70-
"@stdlib/math/base/special/truncf",
62+
"@stdlib/math/base/assert/is-nan",
63+
"@stdlib/math/base/assert/is-infinite",
64+
"@stdlib/math/base/special/pow",
65+
"@stdlib/math/base/special/log10",
66+
"@stdlib/math/base/special/ln",
67+
"@stdlib/math/base/special/abs",
68+
"@stdlib/math/base/special/floor",
69+
"@stdlib/math/base/special/trunc",
7170
"@stdlib/number/float32/base/exponent"
7271
]
7372
},
@@ -82,14 +81,14 @@
8281
"libraries": [],
8382
"libpath": [],
8483
"dependencies": [
85-
"@stdlib/math/base/assert/is-nanf",
86-
"@stdlib/math/base/assert/is-infinitef",
87-
"@stdlib/math/base/special/powf",
88-
"@stdlib/math/base/special/log10f",
89-
"@stdlib/math/base/special/lnf",
90-
"@stdlib/math/base/special/absf",
91-
"@stdlib/math/base/special/floorf",
92-
"@stdlib/math/base/special/truncf",
84+
"@stdlib/math/base/assert/is-nan",
85+
"@stdlib/math/base/assert/is-infinite",
86+
"@stdlib/math/base/special/pow",
87+
"@stdlib/math/base/special/log10",
88+
"@stdlib/math/base/special/ln",
89+
"@stdlib/math/base/special/abs",
90+
"@stdlib/math/base/special/floor",
91+
"@stdlib/math/base/special/trunc",
9392
"@stdlib/number/float32/base/exponent"
9493
]
9594
}

lib/node_modules/@stdlib/math/base/special/truncsdf/src/main.c

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
*/
1818

1919
#include "stdlib/math/base/special/truncsdf.h"
20-
#include "stdlib/math/base/assert/is_nanf.h"
21-
#include "stdlib/math/base/assert/is_infinitef.h"
22-
#include "stdlib/math/base/special/powf.h"
23-
#include "stdlib/math/base/special/log10f.h"
24-
#include "stdlib/math/base/special/lnf.h"
25-
#include "stdlib/math/base/special/absf.h"
26-
#include "stdlib/math/base/special/floorf.h"
27-
#include "stdlib/math/base/special/truncf.h"
20+
#include "stdlib/math/base/assert/is_nan.h"
21+
#include "stdlib/math/base/assert/is_infinite.h"
22+
#include "stdlib/math/base/special/pow.h"
23+
#include "stdlib/math/base/special/log10.h"
24+
#include "stdlib/math/base/special/ln.h"
25+
#include "stdlib/math/base/special/abs.h"
26+
#include "stdlib/math/base/special/floor.h"
27+
#include "stdlib/math/base/special/trunc.h"
2828
#include "stdlib/number/float32/base/exponent.h"
2929
#include <stdint.h>
3030

@@ -38,43 +38,45 @@
3838
*
3939
* @example
4040
* float out = stdlib_base_truncsdf( 3.141592653589793f, 5, 10 );
41-
* // returns 3.1415f
41+
* // returns 3.1414999961853027f
4242
*/
4343
float stdlib_base_truncsdf( const float x, const int32_t n, const int32_t b ) {
44-
float exp;
45-
float s;
44+
double exp;
45+
double dx;
46+
double s;
4647
float y;
4748

48-
if ( stdlib_base_is_nanf( x ) || n < 1 || b <= 0 ) {
49+
if ( stdlib_base_is_nan( (double)x ) || n < 1 || b <= 0 ) {
4950
return 0.0f / 0.0f; // NaN
5051
}
51-
if ( stdlib_base_is_infinitef( x ) || x == 0.0f ) {
52+
if ( stdlib_base_is_infinite( (double)x ) || x == 0.0f ) {
5253
return x;
5354
}
55+
dx = (double)x;
5456
if ( b == 10 ) {
55-
exp = stdlib_base_log10f( stdlib_base_absf( x ) );
57+
exp = stdlib_base_log10( stdlib_base_abs( dx ) );
5658
} else if ( b == 2 ) {
57-
exp = (float)stdlib_base_float32_exponent( stdlib_base_absf( x ) );
59+
exp = (double)stdlib_base_float32_exponent( x );
5860
} else {
59-
exp = stdlib_base_lnf( stdlib_base_absf( x ) ) / stdlib_base_lnf( (float)b );
61+
exp = stdlib_base_ln( stdlib_base_abs( dx ) ) / stdlib_base_ln( (double)b );
6062
}
61-
exp = stdlib_base_floorf( exp - (float)n + 1.0f );
62-
s = stdlib_base_powf( (float)b, stdlib_base_absf( exp ) );
63+
exp = stdlib_base_floor( exp - (double)n + 1.0 );
64+
s = stdlib_base_pow( (double)b, stdlib_base_abs( exp ) );
6365

6466
// Check for overflow:
65-
if ( stdlib_base_is_infinitef( s ) ) {
67+
if ( stdlib_base_is_infinite( s ) ) {
6668
return x;
6769
}
6870

6971
// To avoid numerical stability issues due to floating-point rounding error, we must treat positive and negative exponents separately.
70-
if ( exp < 0.0f ) {
71-
y = stdlib_base_truncf( x * s ) / s;
72+
if ( exp < 0.0 ) {
73+
y = (float)( stdlib_base_trunc( dx * s ) / s );
7274
} else {
73-
y = stdlib_base_truncf( x / s ) * s;
75+
y = (float)( stdlib_base_trunc( dx / s ) * s );
7476
}
7577

7678
// Check for overflow:
77-
if ( stdlib_base_is_infinitef( y ) ) {
79+
if ( stdlib_base_is_infinite( (double)y ) ) {
7880
return x;
7981
}
8082
return y;

0 commit comments

Comments
 (0)