From 2d3fe364e19c18f6ba6a2ca1a2c11009a0839224 Mon Sep 17 00:00:00 2001 From: GUNJ JOSHI Date: Sun, 7 Sep 2025 10:14:29 +0530 Subject: [PATCH 1/3] refactor: modify C implemenation to accept double instead of int32 --- 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: passed - 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: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: passed - task: lint_c_examples status: passed - task: lint_c_benchmarks status: passed - 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 --- --- .../math/base/special/factorial2/README.md | 13 ++++--- .../factorial2/benchmark/c/native/benchmark.c | 4 +-- .../special/factorial2/examples/c/example.c | 5 ++- .../stdlib/math/base/special/factorial2.h | 4 +-- .../base/special/factorial2/manifest.json | 9 +++-- .../math/base/special/factorial2/src/addon.c | 2 +- .../math/base/special/factorial2/src/main.c | 34 +++++++++---------- 7 files changed, 35 insertions(+), 36 deletions(-) diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/README.md b/lib/node_modules/@stdlib/math/base/special/factorial2/README.md index 6c7618989f9a..12607f811947 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/README.md +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/README.md @@ -124,16 +124,16 @@ for ( i = 0; i < values.length; i++ ) { Evaluates the [double factorial][double-factorial] of `n`. ```c -double out = stdlib_base_factorial2( 3 ); -// returns 3 +double out = stdlib_base_factorial2( 3.0 ); +// returns 3.0 ``` The function accepts the following arguments: -- **n**: `[in] int32_t` input value. +- **n**: `[in] double` input value. ```c -double stdlib_base_factorial2( const int32_t n ); +double stdlib_base_factorial2( const double n ); ``` @@ -157,16 +157,15 @@ double stdlib_base_factorial2( const int32_t n ); ```c #include "stdlib/math/base/special/factorial2.h" #include -#include int main( void ) { - const int32_t x[] = { 1, 10, 100, 301, 302 }; + const double x[] = { 1.0, 10.0, 100.0, 301.0, 302.0 }; double b; int i; for ( i = 0; i < 5; i++ ){ b = stdlib_base_factorial2( x[ i ] ); - printf ( "factorial2(%d) = %lf\n", x[ i ], b ); + printf ( "factorial2(%lf) = %lf\n", x[ i ], b ); } } ``` diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c b/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c index 01b814df4cbb..0dc5f2d20440 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c @@ -92,14 +92,14 @@ static double rand_double( void ) { */ static double benchmark( void ) { double elapsed; - int32_t x; + double x; double y; double t; int i; t = tic(); for ( i = 0; i < ITERATIONS; i++ ) { - x = (int32_t)(rand_double() * 301); + x = round( rand_double() * 301 ); y = stdlib_base_factorial2( x ); if ( y != y ) { printf( "should not return NaN\n" ); diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/examples/c/example.c b/lib/node_modules/@stdlib/math/base/special/factorial2/examples/c/example.c index c675e14c31ee..9b67ea9d816f 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/examples/c/example.c +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/examples/c/example.c @@ -18,15 +18,14 @@ #include "stdlib/math/base/special/factorial2.h" #include -#include int main( void ) { - const int32_t x[] = { 1, 10, 100, 301, 302 }; + const double x[] = { 1.0, 10.0, 100.0, 301.0, 302.0 }; double b; int i; for ( i = 0; i < 5; i++ ) { b = stdlib_base_factorial2( x[ i ] ); - printf ( "factorial2(%d) = %lf\n", x[ i ], b ); + printf ( "factorial2(%lf) = %lf\n", x[ i ], b ); } } diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/include/stdlib/math/base/special/factorial2.h b/lib/node_modules/@stdlib/math/base/special/factorial2/include/stdlib/math/base/special/factorial2.h index 3e9803c23f8e..8e2701b427d3 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/include/stdlib/math/base/special/factorial2.h +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/include/stdlib/math/base/special/factorial2.h @@ -19,8 +19,6 @@ #ifndef STDLIB_MATH_BASE_SPECIAL_FACTORIAL2_H #define STDLIB_MATH_BASE_SPECIAL_FACTORIAL2_H -#include - /* * If C++, prevent name mangling so that the compiler emits a binary file having undecorated names, thus mirroring the behavior of a C compiler. */ @@ -31,7 +29,7 @@ extern "C" { /** * Evaluates the double factorial of `n`. */ -double stdlib_base_factorial2( const int32_t n ); +double stdlib_base_factorial2( const double n ); #ifdef __cplusplus } diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json b/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json index 26fece7e4303..ec40b8ebe826 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json @@ -39,7 +39,8 @@ "@stdlib/math/base/napi/unary", "@stdlib/math/base/assert/is-even", "@stdlib/constants/float64/pinf", - "@stdlib/constants/float64/max-nth-double-factorial" + "@stdlib/constants/float64/max-nth-double-factorial", + "@stdlib/math/base/assert/is-integer" ] }, { @@ -55,7 +56,8 @@ "dependencies": [ "@stdlib/math/base/assert/is-even", "@stdlib/constants/float64/pinf", - "@stdlib/constants/float64/max-nth-double-factorial" + "@stdlib/constants/float64/max-nth-double-factorial", + "@stdlib/math/base/assert/is-integer" ] }, { @@ -71,7 +73,8 @@ "dependencies": [ "@stdlib/math/base/assert/is-even", "@stdlib/constants/float64/pinf", - "@stdlib/constants/float64/max-nth-double-factorial" + "@stdlib/constants/float64/max-nth-double-factorial", + "@stdlib/math/base/assert/is-integer" ] } ] diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/src/addon.c b/lib/node_modules/@stdlib/math/base/special/factorial2/src/addon.c index 957029be8fd0..4246c5a369f4 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/src/addon.c +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/src/addon.c @@ -19,4 +19,4 @@ #include "stdlib/math/base/special/factorial2.h" #include "stdlib/math/base/napi/unary.h" -STDLIB_MATH_BASE_NAPI_MODULE_I_D( stdlib_base_factorial2 ) +STDLIB_MATH_BASE_NAPI_MODULE_D_D( stdlib_base_factorial2 ) diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c b/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c index 06a6d4823f5b..f97a171801e8 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c @@ -18,42 +18,42 @@ #include "stdlib/math/base/special/factorial2.h" #include "stdlib/math/base/assert/is_even.h" +#include "stdlib/math/base/assert/is_integer.h" #include "stdlib/constants/float64/pinf.h" #include "stdlib/constants/float64/max_nth_double_factorial.h" -#include /** * Evaluates the double factorial of `n`. * -* @param x input value +* @param n input value * @return double factorial * * @example -* double v = stdlib_base_factorial2( 3 ); -* // returns 3 +* double v = stdlib_base_factorial2( 3.0 ); +* // returns 3.0 */ -double stdlib_base_factorial2( const int32_t n ) { - int32_t last; +double stdlib_base_factorial2( const double n ) { + double last; double out; - int32_t v; - int32_t i; + double v; + double i; + if ( !stdlib_base_is_integer( n ) || n < 0.0 ) { + return 0.0 / 0.0; // NaN + } if ( n > STDLIB_CONSTANT_FLOAT64_MAX_NTH_DOUBLE_FACTORIAL ) { return STDLIB_CONSTANT_FLOAT64_PINF; } - if ( n < 0 ) { - return 0.0/0.0; - } v = n; - if ( v == 0 || v == 1 ) { - return 1; + if ( v == 0.0 || v == 1.0 ) { + return 1.0; } if ( stdlib_base_is_even( v ) ) { - last = 2; + last = 2.0; } else { - last = 3; + last = 3.0; } - out = 1; - for ( i = v; i >= last; i -= 2 ) { + out = 1.0; + for ( i = v; i >= last; i -= 2.0 ) { out *= i; } return out; From 9daee240dc78b5de4b22a3be9e14001d33407838 Mon Sep 17 00:00:00 2001 From: Gunj Joshi Date: Sun, 7 Sep 2025 10:35:22 +0530 Subject: [PATCH 2/3] bench: replace integer by a floating-point number Signed-off-by: Gunj Joshi --- .../math/base/special/factorial2/benchmark/c/native/benchmark.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c b/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c index 0dc5f2d20440..55bd85409d84 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/benchmark/c/native/benchmark.c @@ -99,7 +99,7 @@ static double benchmark( void ) { t = tic(); for ( i = 0; i < ITERATIONS; i++ ) { - x = round( rand_double() * 301 ); + x = round( rand_double() * 301.0 ); y = stdlib_base_factorial2( x ); if ( y != y ) { printf( "should not return NaN\n" ); From c1e1e15621a31ffb20be069dc630986c75c5b835 Mon Sep 17 00:00:00 2001 From: GUNJ JOSHI Date: Sun, 7 Sep 2025 10:53:20 +0530 Subject: [PATCH 3/3] refactor: use is-nonnegative-integer --- 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: na - 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 --- --- .../@stdlib/math/base/special/factorial2/lib/main.js | 7 ++----- .../@stdlib/math/base/special/factorial2/manifest.json | 6 +++--- .../@stdlib/math/base/special/factorial2/src/main.c | 4 ++-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/lib/main.js b/lib/node_modules/@stdlib/math/base/special/factorial2/lib/main.js index 2730090a754a..fe59fdfec4d0 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/lib/main.js +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/lib/main.js @@ -21,7 +21,7 @@ // MODULES // var isnan = require( '@stdlib/math/base/assert/is-nan' ); -var isInteger = require( '@stdlib/math/base/assert/is-integer' ); +var isNonnegativeInteger = require( '@stdlib/math/base/assert/is-nonnegative-integer' ); var isEven = require( '@stdlib/math/base/assert/is-even' ); var PINF = require( '@stdlib/constants/float64/pinf' ); var FLOAT64_MAX_NTH_DOUBLE_FACTORIAL = require( '@stdlib/constants/float64/max-nth-double-factorial' ); // eslint-disable-line id-length @@ -56,15 +56,12 @@ function factorial2( n ) { var out; var v; var i; - if ( isnan( n ) ) { + if ( isnan( n ) || !isNonnegativeInteger( n ) ) { return NaN; } if ( n > FLOAT64_MAX_NTH_DOUBLE_FACTORIAL ) { return PINF; } - if ( n < 0 || isInteger( n ) === false ) { - return NaN; - } v = n|0; // asm type annotation if ( v === 0|0 || v === 1|0 ) { return 1|0; // asm type annotation diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json b/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json index ec40b8ebe826..7600dd148cc5 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/manifest.json @@ -40,7 +40,7 @@ "@stdlib/math/base/assert/is-even", "@stdlib/constants/float64/pinf", "@stdlib/constants/float64/max-nth-double-factorial", - "@stdlib/math/base/assert/is-integer" + "@stdlib/math/base/assert/is-nonnegative-integer" ] }, { @@ -57,7 +57,7 @@ "@stdlib/math/base/assert/is-even", "@stdlib/constants/float64/pinf", "@stdlib/constants/float64/max-nth-double-factorial", - "@stdlib/math/base/assert/is-integer" + "@stdlib/math/base/assert/is-nonnegative-integer" ] }, { @@ -74,7 +74,7 @@ "@stdlib/math/base/assert/is-even", "@stdlib/constants/float64/pinf", "@stdlib/constants/float64/max-nth-double-factorial", - "@stdlib/math/base/assert/is-integer" + "@stdlib/math/base/assert/is-nonnegative-integer" ] } ] diff --git a/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c b/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c index f97a171801e8..791d0f254b68 100644 --- a/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c +++ b/lib/node_modules/@stdlib/math/base/special/factorial2/src/main.c @@ -18,7 +18,7 @@ #include "stdlib/math/base/special/factorial2.h" #include "stdlib/math/base/assert/is_even.h" -#include "stdlib/math/base/assert/is_integer.h" +#include "stdlib/math/base/assert/is_nonnegative_integer.h" #include "stdlib/constants/float64/pinf.h" #include "stdlib/constants/float64/max_nth_double_factorial.h" @@ -37,7 +37,7 @@ double stdlib_base_factorial2( const double n ) { double out; double v; double i; - if ( !stdlib_base_is_integer( n ) || n < 0.0 ) { + if ( !stdlib_base_is_nonnegative_integer( n ) ) { return 0.0 / 0.0; // NaN } if ( n > STDLIB_CONSTANT_FLOAT64_MAX_NTH_DOUBLE_FACTORIAL ) {