Skip to content

feat: add implementation of stdlib/math/base/special/minmaxabsf #6290

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

Open
wants to merge 16 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat!: add implementation of stdlib/math/base/special/minmaxabsf
This commit adds the implementation of stdlib/math/base/special/minmaxabsf function.
It includes a README.md file, benchmarks, tests, examples.
The minmaxabsf function returns the minimum and maximum single-precision floating-point values for any two numbers.

---
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: passed
  - 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: 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: na
  - task: lint_typescript_tests
    status: na
  - task: lint_license_headers
    status: passed
---
  • Loading branch information
sahil20021008 committed Mar 28, 2025
commit 79fa76e34a8fcdbaa56246438fdedadfc93dc06c
2 changes: 1 addition & 1 deletion etc/npm/deps.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@

acorn@"^8.1.0" acorn-loose@"^8.0.2" acorn-walk@"^8.0.2" d3-format@"^1.0.0" d3-scale@"^1.0.0" d3-shape@"^1.0.0" d3-time-format@"^2.0.0" debug@"^2.6.9" glob@"^7.0.5" minimist@"^1.2.0" readable-stream@"^2.1.4" resolve@"^1.1.7" vdom-to-html@"^2.3.0" virtual-dom@"^2.1.1" 0x@"^4.10.2" @cspell/eslint-plugin@"^8.8.0" @commitlint/cli@"^17.4.4" @commitlint/cz-commitlint@"^17.4.4" @conventional-commits/parser@"^0.4.1" @kaciras/deasync@"^1.0.1" @types/node@"^13.9.0" @typescript-eslint/parser@"^6.9.1" @typescript-eslint/eslint-plugin@"^6.9.1" ajv@"^5.2.2" browser-pack-flat@"^3.0.0" browserify@"^17.0.0" bundle-collapser@"^1.3.0" c8@"^7.12.0" chai@"^3.5.0" cheerio@"^1.0.0-rc.12" commitizen@"^4.3.0" common-shakeify@"^0.6.0" conventional-changelog-conventionalcommits@"^5.0.0" doctrine@"^3.0.0" editorconfig-checker@"^6.0.0" envify@"^4.0.0" eslint@"^8.57.0" eslint-plugin-node@"^11.1.0" eslint-plugin-expect-type@"^0.2.3" eslint-plugin-import@"^2.29.0" eslint-plugin-jsdoc@"^46.8.2" exorcist@"^2.0.0" factor-bundle@"^2.5.0" gh-pages@"git+https://github.com/Planeshifter/gh-pages.git#main" inquirer@"^8.0.0" jscodeshift@"^0.15.0" jsdoc@"^3.4.0" lunr@"^2.3.9" mathjax-node@"^2.0.1" mathjax-node-sre@"^3.0.0" mkdirp@"^0.5.1" mustache@"^4.0.0" parse-link-header@"^1.0.1" plato@"^1.5.0" process@"^0.11.10" proxyquire@"^2.0.0" proxyquire-universal@"^2.0.0" proxyquireify@"^3.1.1" read-installed@"^4.0.3" rehype@"^9.0.0" rehype-highlight@"^3.0.0" remark@"^11.0.1" remark-cli@"^7.0.0" remark-frontmatter@"^1.2.0" remark-html@"^10.0.0" remark-lint@"^6.0.0" remark-lint-blockquote-indentation@"^1.0.0" remark-lint-checkbox-character-style@"^1.0.0" remark-lint-checkbox-content-indent@"^1.0.0" remark-lint-code-block-style@"^1.0.0" remark-lint-definition-case@"^1.0.0" remark-lint-definition-spacing@"^1.0.0" remark-lint-emphasis-marker@"^1.0.0" remark-lint-fenced-code-flag@"^1.0.0" remark-lint-fenced-code-marker@"^1.0.0" remark-lint-file-extension@"^1.0.0" remark-lint-final-definition@"^1.0.0" remark-lint-final-newline@"^1.0.0" remark-lint-first-heading-level@"^1.1.0" remark-lint-hard-break-spaces@"^1.0.1" remark-lint-heading-increment@"^1.0.0" remark-lint-heading-style@"^1.0.0" remark-lint-linebreak-style@"^1.0.0" remark-lint-link-title-style@"^1.0.0" remark-lint-list-item-bullet-indent@"^1.0.0" remark-lint-list-item-content-indent@"^1.0.0" remark-lint-list-item-indent@"^1.0.0" remark-lint-list-item-spacing@"^1.1.0" remark-lint-maximum-heading-length@"^1.0.0" remark-lint-maximum-line-length@"^1.0.0" remark-lint-no-auto-link-without-protocol@"^1.0.0" remark-lint-no-blockquote-without-marker@"^2.0.0" remark-lint-no-consecutive-blank-lines@"^1.0.0" remark-lint-no-duplicate-definitions@"^1.0.0" remark-lint-no-duplicate-headings@"^1.0.0" remark-lint-no-duplicate-headings-in-section@"^1.0.0" remark-lint-no-emphasis-as-heading@"^1.0.0" remark-lint-no-empty-url@"^1.0.1" remark-lint-no-file-name-articles@"^1.0.0" remark-lint-no-file-name-consecutive-dashes@"^1.0.0" remark-lint-no-file-name-irregular-characters@"^1.0.0" remark-lint-no-file-name-mixed-case@"^1.0.0" remark-lint-no-file-name-outer-dashes@"^1.0.1" remark-lint-no-heading-content-indent@"^1.0.0" remark-lint-no-heading-indent@"^1.0.0" remark-lint-no-heading-like-paragraph@"^1.0.0" remark-lint-no-heading-punctuation@"^1.0.0" remark-lint-no-html@"^1.0.0" remark-lint-no-inline-padding@"^1.0.0" remark-lint-no-literal-urls@"^1.0.0" remark-lint-no-missing-blank-lines@"^1.0.0" remark-lint-no-multiple-toplevel-headings@"^1.0.0" remark-lint-no-paragraph-content-indent@"^1.0.1" remark-lint-no-reference-like-url@"^1.0.0" remark-lint-no-shell-dollars@"^1.0.0" remark-lint-no-shortcut-reference-image@"^1.0.0" remark-lint-no-shortcut-reference-link@"^1.0.1" remark-lint-no-table-indentation@"^1.0.0" remark-lint-no-tabs@"^1.0.0" remark-lint-no-trailing-spaces@"^3.0.2" remark-lint-no-undefined-references@"^1.0.0" remark-lint-no-unused-definitions@"^1.0.0" remark-lint-ordered-list-marker-style@"^1.0.0" remark-lint-ordered-list-marker-value@"^1.0.0" remark-lint-rule-style@"^1.0.0" remark-lint-strong-marker@"^1.0.0" remark-lint-table-cell-padding@"^1.0.0" remark-lint-table-pipe-alignment@"^1.0.0" remark-lint-table-pipes@"^1.0.0" remark-lint-unordered-list-marker-style@"^1.0.0" remark-slug@"^5.0.0" remark-unlink@"^2.0.0" remark-validate-links@"^9.0.1" remark-vdom@"^8.0.0" semver@"^6.0.0" source-map-explorer@"^2.5.3" spdx-license-ids@"^3.0.0" tap-min@"git+https://github.com/Planeshifter/tap-min.git" tap-spec@"5.x.x" tap-summary@"^4.0.0" tap-xunit@"^2.2.0" tape@"git+https://github.com/kgryte/tape.git#fix/globby" to-vfile@"^6.0.0" typedoc@"git+https://github.com/kgryte/typedoc.git#0.16.11-patch" typescript@"4.3.5" uglify-js@"^3.17.4" uglifyify@"^5.0.0" unified-lint-rule@"^1.0.1" unist-util-visit@"^2.0.0" unist-util-visit-parents@"^3.1.1" yaml@"^1.0.0" node-gyp@"^9.3.1"
17 changes: 9 additions & 8 deletions lib/node_modules/@stdlib/math/base/special/minmaxabsf/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,29 +45,29 @@ var minmaxabsf = require( '@stdlib/math/base/special/minmaxabsf' );
Returns the minimum and maximum absolute single-precision floating-point values in a single pass.

```javascript
var v = minmaxabsf( 4.2, 3.14 );
// returns [ 3.14, 4.2 ]
var v = minmaxabsf( 4.0, 3.0 );
// returns <Float32Array>[ 3.0, 4.0 ]

v = minmaxabsf( +0.0, -0.0 );
// returns [ 0.0, 0.0 ]
// returns <Float32Array>[ 0.0, 0.0 ]
```

If any argument is `NaN`, the function returns `Nan` for both the minimum value and the maximum value.

```javascript
var v = minmaxabs( 4.2, NaN );
// returns [ NaN, NaN ]
var v = minmaxabsf( 4.2, NaN );
// returns <Float32Array>[ NaN, NaN ]

v = minmaxabs( NaN, 3.14 );
// returns [ NaN, NaN ]
v = minmaxabsf( NaN, 3.14 );
// returns <Float32Array>[ NaN, NaN ]
```

#### minmaxabsf.assign( x, y, out, stride, offset )

Returns the minimum and maximum absolute single-precision values in a single pass and assigns the results to a provided output array.

```javascript
var Float64Array = require( '@stdlib/array/float32' );
var Float32Array = require( '@stdlib/array/float32' );

var out = new Float32Array( 2 );

Expand Down Expand Up @@ -160,6 +160,7 @@ stdlib_base_minmaxabsf( 0.0f, -0.0f, &min, &max );
```

The function accepts the following arguments:

- **x**: `[in] float` input value.
- **y**: `[in] float` input value.
- **min**: `[in] *float` output min.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@
var bench = require( '@stdlib/bench' );
var randu = require( '@stdlib/random/base/randn' );
var isFloat32Array = require( '@stdlib/assert/is-float32array' );
var isArray = require( '@stdlib/assert/is-array' );
var minf = require( '@stdlib/math/base/special/minf' );
var maxf = require( '@stdlib/math/base/special/maxf' );
var float32Array = require( '@stdlib/array/float32' );
var pkg = require( './../package.json' ).name;
var minmaxabsf = require( './../lib' );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ extern "C" {
/**
* Returns the minimum and maximum absolute single-precision floating-point number.
*/
float stdlib_base_minmaxabsf( const float x, const float y, float* min, float* max );
void stdlib_base_minmaxabsf( const float x, const float y, float* min, float* max );

#ifdef __cplusplus
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,25 @@ var absf = require( '@stdlib/math/base/special/absf' );
* @example
* var out = [ 0.0, 0.0 ];
* var v = minmaxabsf( 3.14, 4.2, out, 1, 0 );
* // returns [ 3.14, 4.2 ]
* // returns <Float32Array>[ 3.14, 4.2 ]
*
* var bool = ( v === out );
* // returns true
*
* @example
* var out = [ 0.0, 0.0 ];
* var v = minmaxabsf( -5.9, 3.14, out, 1, 0 );
* // returns [ 3.14, 5.9 ]
* // returns <Float32Array>[ 3.14, 5.9 ]
*
* @example
* var out = [ 0.0, 0.0 ];
* var v = minmaxabsf( 3.14, NaN, out, 1, 0 );
* // returns [ NaN, NaN ]
* // returns <Float32Array>[ NaN, NaN ]
*
* @example
* var out = [ 0.0, 0.0 ];
* var v = minmaxabsf( +0.0, -0.0, out, 1, 0 );
* // returns [ 0.0, 0.0 ]
* // returns <Float32Array>[ 0.0, 0.0 ]
*/
function minmaxabsf( x, y, out, stride, offset ) {
var ax;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ var assign = require( './assign.js' );
* @returns {Array<number>} minimum and maximum absolute single-precision floating-point values
*
* @example
* var v = minmaxabsf( 3.14, 4.2 );
* // returns <Float32Array>[ 3.14, 4.2 ]
* var v = minmaxabsf( 3.0, 4.0 );
* // returns <Float32Array>[ 3.0, 4.0 ]
*
* @example
* var v = minmaxabsf( 3.14, NaN );
Expand All @@ -47,7 +47,7 @@ var assign = require( './assign.js' );
* // returns <Float32Array>[ 0.0, 0.0 ]
*/
function minmaxabsf( x, y ) {
var out = new float32Array( 2 );
var out = new float32Array( 2 );
x = float64ToFloat32( x );
y = float64ToFloat32( y );
return assign( x, y, out, 1, 0 );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@

// MODULES //

var addon = require( './../src/addon.node' );
var float32Array = require( '@stdlib/array/float32' );
var float64ToFloat32 = require( '@stdlib/number/float64/base/to-float32' );
var addon = require( './../src/addon.node' );


// MAIN //
Expand All @@ -34,8 +34,8 @@ var float64ToFloat32 = require( '@stdlib/number/float64/base/to-float32' );
* @returns {Array<number>} minimum and maximum absolute single-precision floating-point values
*
* @example
* var v = minmaxabsf( 3.14, 4.2 );
* // returns <Float32Array>[ 3.14, 4.2 ]
* var v = minmaxabsf( 3.0, 4.0 );
* // returns <Float32Array>[ 3.0, 4.0 ]
*
* @example
* var v = minmaxabsf( 3.14, NaN );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@
"@stdlib/math/base/assert/is-nanf",
"@stdlib/math/base/napi/binary",
"@stdlib/math/base/special/absf",
"@stdlib/math/base/assert/is-nanf",
"@stdlib/constants/float32/nan.h"
"@stdlib/math/base/assert/is-nanf"
]
},
{
Expand All @@ -67,8 +66,7 @@
"@stdlib/math/base/assert/is-nanf",
"@stdlib/math/base/napi/binary",
"@stdlib/math/base/special/absf",
"@stdlib/math/base/assert/is-nanf",
"@stdlib/constants/float32/nan.h"
"@stdlib/math/base/assert/is-nanf"
]
},
{
Expand All @@ -90,8 +88,7 @@
"@stdlib/math/base/assert/is-nanf",
"@stdlib/math/base/napi/binary",
"@stdlib/math/base/special/absf",
"@stdlib/math/base/assert/is-nanf",
"@stdlib/constants/float32/nan.h"
"@stdlib/math/base/assert/is-nanf"
]
}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,21 @@

#include "stdlib/math/base/special/minmaxabsf.h"
#include "stdlib/math/base/napi/binary.h"
#include "stdlib/napi/argv.h"
#include "stdlib/napi/argv_float.h"
#include "stdlib/napi/argv_float32array.h"
#include "stdlib/napi/export.h"
#include <node_api.h>

static napi_value addon( napi_env env, napi_callback_info info ){
STDLIB_NAPI_ARGV( env, info, argv, argc, 3 );
STDLIB_NAPI_ARGV_FLOAT( env, x, argv, 0 );
STDLIB_NAPI_ARGV_FLOAT( env, y, argv, 1 );
STDLIB_NAPI_ARGV_FLOAT32ARRAY(env, out, len, argv, 2 );
STDLIB_MATH_BASE_NAPI_MODULE_FF_F( stdlib_base_minmaxabsf );
stdlib_base_minmaxabsf( x, y, &out[0], &out[1] );
return NULL;
}

// cppcheck-suppress shadowFunction
STDLIB_MATH_BASE_NAPI_MODULE_FF_F( stdlib_base_minmaxabsf )
STDLIB_NAPI_MODULE_EXPORT_FCN( addon )
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "stdlib/math/base/special/minmaxabsf.h"
#include "stdlib/math/base/assert/is_nanf.h"
#include "stdlib/math/base/special/absf.h"
#include "stdlib/constants/float32/nan.h"
// #include "stdlib/constants/float32/nan.h"

/**
* Evaluates the single-precision min and max value.
Expand All @@ -44,8 +44,8 @@
*/
void stdlib_base_minmaxabsf( const float x, const float y, float* min, float* max ){
if ( stdlib_base_is_nanf( x ) || stdlib_base_is_nanf( y ) ) {
*min = STDLIB_CONSTANT_FLOAT32_NAN;
*max = STDLIB_CONSTANT_FLOAT32_NAN;
*min = 0.0f/0.0f;
*max = 0.0f/0.0f;
return;
}
float ax = stdlib_base_absf( x );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

var tape = require( 'tape' );
var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
var isNegativeZero = require( '@stdlib/math/base/assert/is-negative-zero' );
var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' );
var float64ToFloat32 = require( '@stdlib/number/float64/base/to-float32' );
var PINF = require( '@stdlib/constants/float32/pinf' );
Expand Down
Loading