diff --git a/CHANGELOG.md b/CHANGELOG.md
index c05d9c8eb..1424b25ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -516,6 +516,28 @@ This release closes the following issue:
+
+
+#### [@stdlib/math/base/napi/ternary](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/math/base/napi/ternary)
+
+
+
+
+
+##### Features
+
+- [`74f3c08`](https://github.com/stdlib-js/stdlib/commit/74f3c08113fa7555d9010d3cb814f7a8ea7ea47e) - add `dii_d` in `math/base/napi/ternary` [(#2546)](https://github.com/stdlib-js/stdlib/pull/2546)
+
+
+
+
+
+
+
+
+
+
+
#### [@stdlib/math/base/napi/unary](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/math/base/napi/unary)
@@ -4922,6 +4944,7 @@ A total of 29 people contributed to this release. Thank you to the following con
+- [`74f3c08`](https://github.com/stdlib-js/stdlib/commit/74f3c08113fa7555d9010d3cb814f7a8ea7ea47e) - **feat:** add `dii_d` in `math/base/napi/ternary` [(#2546)](https://github.com/stdlib-js/stdlib/pull/2546) _(by Gunj Joshi, Athan Reines)_
- [`ca18359`](https://github.com/stdlib-js/stdlib/commit/ca18359c4b18000828a214bc52a32db7ac6c1121) - **refactor:** update to use stdlib `pow` [(#2539)](https://github.com/stdlib-js/stdlib/pull/2539) _(by Gunj Joshi)_
- [`efc3551`](https://github.com/stdlib-js/stdlib/commit/efc3551764c30c6cae9a48058cae2868d4055190) - **feat:** add C implementation for `math/base/special/round2` [(##2537)](#2537) _(by Gunj Joshi)_
- [`62e703a`](https://github.com/stdlib-js/stdlib/commit/62e703a5eb7df95a40b3592366da89c5ff42a1b1) - **docs:** add missing `@private` in `math/base/special/round/lib/native.js` [(##2536)](#2536) _(by Gunj Joshi)_
diff --git a/base/napi/ternary/README.md b/base/napi/ternary/README.md
index f2f386aa9..4dca5fb06 100644
--- a/base/napi/ternary/README.md
+++ b/base/napi/ternary/README.md
@@ -182,6 +182,46 @@ The function accepts the following arguments:
void stdlib_math_base_napi_fff_f( napi_env env, napi_callback_info info, float (*fcn)( float, float, float ) );
```
+#### stdlib_math_base_napi_dii_d( env, info, fcn )
+
+Invokes a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number.
+
+```c
+#include
+#include
+
+// ...
+
+static double fcn( const double x, const int32_t y, const int32_t z ) {
+ // ...
+}
+
+// ...
+
+/**
+* Receives JavaScript callback invocation data.
+*
+* @param env environment under which the function is invoked
+* @param info callback data
+* @return Node-API value
+*/
+napi_value addon( napi_env env, napi_callback_info info ) {
+ return stdlib_math_base_napi_dii_d( env, info, fcn );
+}
+
+// ...
+```
+
+The function accepts the following arguments:
+
+- **env**: `[in] napi_env` environment under which the function is invoked.
+- **info**: `[in] napi_callback_info` callback data.
+- **fcn**: `[in] double (*fcn)( double, int32_t, int32_t )` ternary function.
+
+```c
+void stdlib_math_base_napi_dii_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t, int32_t ) );
+```
+
#### STDLIB_MATH_BASE_NAPI_MODULE_DDD_D( fcn )
Macro for registering a Node-API module exporting an interface for invoking a ternary function accepting and returning double-precision floating-point numbers.
@@ -224,6 +264,29 @@ The macro expects the following arguments:
When used, this macro should be used **instead of** `NAPI_MODULE`. The macro includes `NAPI_MODULE`, thus ensuring Node-API module registration.
+#### STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn )
+
+Macro for registering a Node-API module exporting an interface for invoking a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number.
+
+```c
+#include
+
+static double fcn( const double x, const int32_t y, const int32_t z ) {
+ // ...
+}
+
+// ...
+
+// Register a Node-API module:
+STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn );
+```
+
+The macro expects the following arguments:
+
+- **fcn**: `double (*fcn)( double, int32_t, int32_t )` ternary function.
+
+When used, this macro should be used **instead of** `NAPI_MODULE`. The macro includes `NAPI_MODULE`, thus ensuring Node-API module registration.
+
diff --git a/base/napi/ternary/include/stdlib/math/base/napi/ternary.h b/base/napi/ternary/include/stdlib/math/base/napi/ternary.h
index 78ea9d674..514b72add 100644
--- a/base/napi/ternary/include/stdlib/math/base/napi/ternary.h
+++ b/base/napi/ternary/include/stdlib/math/base/napi/ternary.h
@@ -102,6 +102,48 @@
}; \
NAPI_MODULE( NODE_GYP_MODULE_NAME, stdlib_math_base_napi_fff_f_init )
+/**
+* Macro for registering a Node-API module exporting an interface invoking a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number.
+*
+* @param fcn ternary function
+*
+* @example
+* #include
+*
+* static double fcn( const double x, const int_32 y, const int_32 z ) {
+* // ...
+* }
+*
+* // ...
+*
+* // Register a Node-API module:
+* STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn );
+*/
+#define STDLIB_MATH_BASE_NAPI_MODULE_DII_D( fcn ) \
+ static napi_value stdlib_math_base_napi_dii_d_wrapper( \
+ napi_env env, \
+ napi_callback_info info \
+ ) { \
+ return stdlib_math_base_napi_dii_d( env, info, fcn ); \
+ }; \
+ static napi_value stdlib_math_base_napi_dii_d_init( \
+ napi_env env, \
+ napi_value exports \
+ ) { \
+ napi_value fcn; \
+ napi_status status = napi_create_function( \
+ env, \
+ "exports", \
+ NAPI_AUTO_LENGTH, \
+ stdlib_math_base_napi_dii_d_wrapper, \
+ NULL, \
+ &fcn \
+ ); \
+ assert( status == napi_ok ); \
+ return fcn; \
+ }; \
+ NAPI_MODULE( NODE_GYP_MODULE_NAME, stdlib_math_base_napi_dii_d_init )
+
/*
* If C++, prevent name mangling so that the compiler emits a ternary file having undecorated names, thus mirroring the behavior of a C compiler.
*/
@@ -119,6 +161,11 @@ napi_value stdlib_math_base_napi_ddd_d( napi_env env, napi_callback_info info, d
*/
napi_value stdlib_math_base_napi_fff_f( napi_env env, napi_callback_info info, float (*fcn)( float, float, float ) );
+/**
+* Invokes a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number.
+*/
+napi_value stdlib_math_base_napi_dii_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t, int32_t ) );
+
#ifdef __cplusplus
}
#endif
diff --git a/base/napi/ternary/src/main.c b/base/napi/ternary/src/main.c
index 60efcb7c4..92b89ca09 100644
--- a/base/napi/ternary/src/main.c
+++ b/base/napi/ternary/src/main.c
@@ -172,3 +172,79 @@ napi_value stdlib_math_base_napi_fff_f( napi_env env, napi_callback_info info, f
return v;
}
+
+/**
+* Invokes a ternary function accepting a double-precision floating-point number and two signed 32-bit integers and returning a double-precision floating-point number.
+*
+* ## Notes
+*
+* - This function expects that the callback `info` argument provides access to the following JavaScript arguments:
+*
+* - `x`: input value.
+* - `y`: input value.
+* - `z`: input value.
+*
+* @param env environment under which the function is invoked
+* @param info callback data
+* @param fcn ternary function
+* @return function return value as a Node-API double-precision floating-point number
+*/
+napi_value stdlib_math_base_napi_dii_d( napi_env env, napi_callback_info info, double (*fcn)( double, int32_t, int32_t ) ) {
+ napi_status status;
+
+ size_t argc = 3;
+ napi_value argv[ 3 ];
+ status = napi_get_cb_info( env, info, &argc, argv, NULL, NULL );
+ assert( status == napi_ok );
+
+ if ( argc < 3 ) {
+ status = napi_throw_error( env, NULL, "invalid invocation. Must provide three numbers." );
+ assert( status == napi_ok );
+ return NULL;
+ }
+
+ napi_valuetype vtype0;
+ status = napi_typeof( env, argv[ 0 ], &vtype0 );
+ assert( status == napi_ok );
+ if ( vtype0 != napi_number ) {
+ status = napi_throw_type_error( env, NULL, "invalid argument. First argument must be a number." );
+ assert( status == napi_ok );
+ return NULL;
+ }
+
+ napi_valuetype vtype1;
+ status = napi_typeof( env, argv[ 1 ], &vtype1 );
+ assert( status == napi_ok );
+ if ( vtype1 != napi_number ) {
+ status = napi_throw_type_error( env, NULL, "invalid argument. Second argument must be a number." );
+ assert( status == napi_ok );
+ return NULL;
+ }
+
+ napi_valuetype vtype2;
+ status = napi_typeof( env, argv[ 2 ], &vtype2 );
+ assert( status == napi_ok );
+ if ( vtype2 != napi_number ) {
+ status = napi_throw_type_error( env, NULL, "invalid argument. Third argument must be a number." );
+ assert( status == napi_ok );
+ return NULL;
+ }
+
+ double x;
+ status = napi_get_value_double( env, argv[ 0 ], &x );
+ assert( status == napi_ok );
+
+ int32_t y;
+ status = napi_get_value_int32( env, argv[ 1 ], &y );
+ assert( status == napi_ok );
+
+ int32_t z;
+ status = napi_get_value_int32( env, argv[ 2 ], &z );
+ assert( status == napi_ok );
+
+ napi_value v;
+ status = napi_create_double( env, fcn( x, y, z ), &v );
+ assert( status == napi_ok );
+
+ return v;
+}