-
-
Notifications
You must be signed in to change notification settings - Fork 838
feat: add math/base/special/cinvf
#3103
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
aayush0325
wants to merge
42
commits into
stdlib-js:develop
Choose a base branch
from
aayush0325:cinvf
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+3,284
−0
Open
Changes from 35 commits
Commits
Show all changes
42 commits
Select commit
Hold shift + click to select a range
9df4fb1
feat: basic setup
aayush0325 a574281
feat: basic c files added
aayush0325 9aee3b0
feat: basic js files added
aayush0325 f0e76ad
feat: tests added
aayush0325 1dc1612
feat: docs added
aayush0325 accab3f
feat: examples added
aayush0325 89640dc
feat: benchmarks added
aayush0325 c67937b
feat: julia benchmark updated
aayush0325 2c47328
fix: example error in README
aayush0325 ccedb23
feat: updated c code using stdlib_base_maxf
aayush0325 193c5c7
feat: updated c code using stdlib_base_maxf
aayush0325 8d92eff
feat: updated tolerance for C tests
aayush0325 b933479
feat: code using maxf
aayush0325 f0bf2fe
feat: code using fmaxf
aayush0325 15e5d34
feat: updated tests for c files
aayush0325 6a21435
feat: updated test coverage
aayush0325 068956c
chore: stuff from code review
aayush0325 072e306
chore: stuff from code review
aayush0325 ed89c11
chore: stuff from code review
aayush0325 a054780
chore: stuff from code review
aayush0325 1d636a1
feat: updated code using stdlib_base_maxf
aayush0325 84b6d22
feat: updated tolerance in test.native.js to match test.js
aayush0325 7173f36
feat: updated data for tests
aayush0325 2a0601d
feat: updated data for tests
aayush0325 eac619c
feat: matching tolerance for js and c files
aayush0325 c9e68e6
chore: stuff from code review
aayush0325 5e99120
feat: tests with lowest possible tolerance
aayush0325 603897b
chore: stuff from code review
aayush0325 97cedfe
chore: stuff from code review
aayush0325 3153991
chore: stuff from code review
aayush0325 6812566
chore: pending changes
aayush0325 a775abb
feat: updated benchmarks with precomputation
aayush0325 e1e187a
chore: stuff from code review
aayush0325 6bbd6ee
Merge remote-tracking branch 'upstream/develop' into cinvf
stdlib-bot f7979ec
Merge remote-tracking branch 'upstream/develop' into cinvf
stdlib-bot dcfbf2a
docs: reorder variable declarations
gunjjoshi e70b3c1
docs: use correct function name
gunjjoshi bd17893
docs: update output values
gunjjoshi 3448159
test: update tests
gunjjoshi 61e9d32
Update package.json
gunjjoshi 2b28783
feat: updated examples with precomputation
5cf999a
feat: updated test coverage
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
251 changes: 251 additions & 0 deletions
251
lib/node_modules/@stdlib/math/base/special/cinvf/README.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,251 @@ | ||
<!-- | ||
|
||
@license Apache-2.0 | ||
|
||
Copyright (c) 2024 The Stdlib Authors. | ||
|
||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
|
||
http://www.apache.org/licenses/LICENSE-2.0 | ||
|
||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
|
||
--> | ||
|
||
# cinvf | ||
|
||
> Compute the inverse of a single-precision complex floating-point number. | ||
|
||
<section class="intro"> | ||
|
||
The inverse (or reciprocal) of a non-zero complex number `z = a + bi` is defined as | ||
|
||
<!-- <equation class="equation" label="eq:complex_inverse" align="center" raw="{\frac {1}{z}}=\frac{\bar{z}}{z{\bar{z}}} = \frac{a}{a^{2}+b^{2}} - \frac{b}{a^2+b^2}i." alt="Complex Inverse" > --> | ||
|
||
<div class="equation" align="center" data-raw-text="{\frac {1}{z}}=\frac{\bar{z}}{z{\bar{z}}} = \frac{a}{a^{2}+b^{2}} - \frac{b}{a^2+b^2}i." data-equation="eq:complex_inverse"> | ||
<img src="https://cdn.jsdelivr.net/gh/stdlib-js/stdlib@026bc0ee34051ddb44f3222f620bc7a300b9799e/lib/node_modules/@stdlib/math/base/special/cinvf/docs/img/equation_complex_inverse.svg" alt="Complex Inverse"> | ||
<br> | ||
</div> | ||
|
||
<!-- </equation> --> | ||
|
||
</section> | ||
|
||
<!-- /.intro --> | ||
|
||
<section class="usage"> | ||
|
||
## Usage | ||
|
||
```javascript | ||
var cinvf = require( '@stdlib/math/base/special/cinvf' ); | ||
``` | ||
|
||
#### cinvf( z ) | ||
|
||
Computes the inverse of a single-precision complex floating-point number. | ||
|
||
```javascript | ||
var Complex64 = require( '@stdlib/complex/float32/ctor' ); | ||
var real = require( '@stdlib/complex/float32/real' ); | ||
var imag = require( '@stdlib/complex/float32/imag' ); | ||
|
||
var v = cinvf( new Complex64( 2.0, 4.0 ) ); | ||
// returns <Complex64> | ||
|
||
var re = real( v ); | ||
// returns ~0.1 | ||
|
||
var im = imag( v ); | ||
// returns ~-0.2 | ||
``` | ||
|
||
</section> | ||
|
||
<!-- /.usage --> | ||
|
||
<section class="examples"> | ||
|
||
## Examples | ||
|
||
<!-- eslint no-undef: "error" --> | ||
|
||
```javascript | ||
var Complex64 = require( '@stdlib/complex/float32/ctor' ); | ||
var uniform = require( '@stdlib/random/base/uniform' ); | ||
var cinvf = require( '@stdlib/math/base/special/cinvf' ); | ||
|
||
var z1; | ||
var z2; | ||
var i; | ||
|
||
for ( i = 0; i < 100; i++ ) { | ||
z1 = new Complex64( uniform( -50.0, 50.0 ), uniform( -50.0, 50.0 ) ); | ||
z2 = cinvf( z1 ); | ||
console.log( '1.0 / (%s) = %s', z1.toString(), z2.toString() ); | ||
} | ||
``` | ||
|
||
</section> | ||
|
||
<!-- /.examples --> | ||
|
||
<!-- C interface documentation. --> | ||
|
||
* * * | ||
|
||
<section class="c"> | ||
|
||
## C APIs | ||
|
||
<!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. --> | ||
|
||
<section class="intro"> | ||
|
||
</section> | ||
|
||
<!-- /.intro --> | ||
|
||
<!-- C usage documentation. --> | ||
|
||
<section class="usage"> | ||
|
||
### Usage | ||
|
||
```c | ||
#include "stdlib/math/base/special/cinvf.h" | ||
``` | ||
|
||
#### stdlib_base_cinvf( z ) | ||
|
||
Computes the inverse of a single-precision complex floating-point number. | ||
|
||
```c | ||
#include "stdlib/complex/float32/ctor.h" | ||
#include "stdlib/complex/float32/real.h" | ||
#include "stdlib/complex/float32/imag.h" | ||
|
||
stdlib_complex64_t z = stdlib_complex64( 2.0f, 4.0f ); | ||
|
||
stdlib_complex64_t out = stdlib_base_cinvf( z ); | ||
|
||
float re = stdlib_complex64_real( out ); | ||
// returns 0.1f | ||
|
||
float im = stdlib_complex64_imag( out ); | ||
// returns -0.2f | ||
``` | ||
|
||
The function accepts the following arguments: | ||
|
||
- **z**: `[in] stdlib_complex64_t` input value. | ||
|
||
```c | ||
stdlib_complex64_t stdlib_base_cinvf( const stdlib_complex64_t z ); | ||
``` | ||
|
||
</section> | ||
|
||
<!-- /.usage --> | ||
|
||
<!-- C API usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. --> | ||
|
||
<section class="notes"> | ||
|
||
</section> | ||
|
||
<!-- /.notes --> | ||
|
||
<!-- C API usage examples. --> | ||
|
||
<section class="examples"> | ||
|
||
### Examples | ||
|
||
```c | ||
#include "stdlib/math/base/special/cinvf.h" | ||
#include "stdlib/complex/float32/ctor.h" | ||
#include "stdlib/complex/float32/reim.h" | ||
#include <stdio.h> | ||
|
||
int main() { | ||
const stdlib_complex64_t x[] = { | ||
stdlib_complex64( 3.14f, 1.5f ), | ||
stdlib_complex64( -3.14f, -1.5f ), | ||
stdlib_complex64( 0.0f, 0.0f ), | ||
stdlib_complex64( 0.0f / 0.0f, 0.0f / 0.0f ) | ||
}; | ||
|
||
stdlib_complex64_t v; | ||
stdlib_complex64_t y; | ||
float re1; | ||
float im1; | ||
float re2; | ||
float im2; | ||
int i; | ||
for ( i = 0; i < 4; i++ ) { | ||
v = x[ i ]; | ||
y = stdlib_base_cinvf( v ); | ||
stdlib_complex64_reim( v, &re1, &im1 ); | ||
stdlib_complex64_reim( y, &re2, &im2 ); | ||
printf( "cinvf(%f + %fi) = %f + %fi\n", re1, im1, re2, im2 ); | ||
} | ||
} | ||
``` | ||
|
||
</section> | ||
|
||
<!-- /.examples --> | ||
|
||
</section> | ||
|
||
<!-- /.c --> | ||
|
||
* * * | ||
|
||
<section class="references"> | ||
|
||
## References | ||
|
||
- Smith, Robert L. 1962. "Algorithm 116: Complex Division." _Commun. ACM_ 5 (8). New York, NY, USA: ACM: 435. doi:[10.1145/368637.368661][@smith:1962a]. | ||
- Stewart, G. W. 1985. "A Note on Complex Division." _ACM Trans. Math. Softw._ 11 (3). New York, NY, USA: ACM: 238–41. doi:[10.1145/214408.214414][@stewart:1985a]. | ||
- Priest, Douglas M. 2004. "Efficient Scaling for Complex Division." _ACM Trans. Math. Softw._ 30 (4). New York, NY, USA: ACM: 389–401. doi:[10.1145/1039813.1039814][@priest:2004a]. | ||
- Baudin, Michael, and Robert L. Smith. 2012. "A Robust Complex Division in Scilab." _arXiv_ abs/1210.4539 \[cs.MS] (October): 1–25. [<https://arxiv.org/abs/1210.4539>][@baudin:2012a]. | ||
|
||
</section> | ||
|
||
<!-- /.references --> | ||
|
||
<!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. --> | ||
|
||
<section class="related"> | ||
|
||
</section> | ||
|
||
<!-- /.related --> | ||
|
||
<!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. --> | ||
|
||
<section class="links"> | ||
|
||
[@smith:1962a]: https://doi.org/10.1145/368637.368661 | ||
|
||
[@stewart:1985a]: https://doi.org/10.1145/214408.214414 | ||
|
||
[@priest:2004a]: https://doi.org/10.1145/1039813.1039814 | ||
|
||
[@baudin:2012a]: https://arxiv.org/abs/1210.4539 | ||
|
||
<!-- <related-links> --> | ||
|
||
<!-- </related-links> --> | ||
|
||
</section> | ||
|
||
<!-- /.links --> |
58 changes: 58 additions & 0 deletions
58
lib/node_modules/@stdlib/math/base/special/cinvf/benchmark/benchmark.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/** | ||
* @license Apache-2.0 | ||
* | ||
* Copyright (c) 2024 The Stdlib Authors. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
'use strict'; | ||
|
||
// MODULES // | ||
|
||
var bench = require( '@stdlib/bench' ); | ||
var uniform = require( '@stdlib/random/base/uniform' ); | ||
var isnanf = require( '@stdlib/math/base/assert/is-nanf' ); | ||
var Complex64 = require( '@stdlib/complex/float32/ctor' ); | ||
var real = require( '@stdlib/complex/float32/real' ); | ||
var imag = require( '@stdlib/complex/float32/imag' ); | ||
var pkg = require( './../package.json' ).name; | ||
var cinvf = require( './../lib' ); | ||
|
||
|
||
// MAIN // | ||
|
||
bench( pkg, function benchmark( b ) { | ||
var values; | ||
var y; | ||
var i; | ||
|
||
values = [ | ||
new Complex64( uniform( -500.0, 500.0 ), uniform( -500.0, 500.0 ) ), | ||
new Complex64( uniform( -500.0, 500.0 ), uniform( -500.0, 500.0 ) ) | ||
]; | ||
|
||
b.tic(); | ||
for ( i = 0; i < b.iterations; i++ ) { | ||
y = cinvf( values[ i % values.length ] ); | ||
if ( isnanf( real( y ) ) ) { | ||
b.fail( 'should not return NaN' ); | ||
} | ||
} | ||
b.toc(); | ||
if ( isnanf( imag( y ) ) ) { | ||
b.fail( 'should not return not NaN' ); | ||
} | ||
b.pass( 'benchmark finished' ); | ||
b.end(); | ||
}); |
67 changes: 67 additions & 0 deletions
67
lib/node_modules/@stdlib/math/base/special/cinvf/benchmark/benchmark.native.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
/** | ||
* @license Apache-2.0 | ||
* | ||
* Copyright (c) 2024 The Stdlib Authors. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
'use strict'; | ||
|
||
// MODULES // | ||
|
||
var resolve = require( 'path' ).resolve; | ||
var bench = require( '@stdlib/bench' ); | ||
var uniform = require( '@stdlib/random/base/uniform' ); | ||
var isnanf = require( '@stdlib/math/base/assert/is-nanf' ); | ||
var real = require( '@stdlib/complex/float32/real' ); | ||
var imag = require( '@stdlib/complex/float32/imag' ); | ||
var Complex64 = require( '@stdlib/complex/float32/ctor' ); | ||
var tryRequire = require( '@stdlib/utils/try-require' ); | ||
var pkg = require( './../package.json' ).name; | ||
|
||
|
||
// VARIABLES // | ||
|
||
var cinvf = tryRequire( resolve( __dirname, './../lib/native.js' ) ); | ||
var opts = { | ||
'skip': ( cinvf instanceof Error ) | ||
}; | ||
|
||
|
||
// MAIN // | ||
|
||
bench( pkg+'::native', opts, function benchmark( b ) { | ||
var values; | ||
var y; | ||
var i; | ||
|
||
values = [ | ||
new Complex64( uniform( -500.0, 500.0 ), uniform( -500.0, 500.0 ) ), | ||
new Complex64( uniform( -500.0, 500.0 ), uniform( -500.0, 500.0 ) ) | ||
]; | ||
|
||
b.tic(); | ||
for ( i = 0; i < b.iterations; i++ ) { | ||
y = cinvf( values[ i % values.length ] ); | ||
if ( isnanf( real( y ) ) ) { | ||
b.fail( 'should not return NaN' ); | ||
} | ||
} | ||
b.toc(); | ||
if ( isnanf( imag( y ) ) ) { | ||
b.fail( 'should not return NaN' ); | ||
} | ||
b.pass( 'benchmark finished' ); | ||
b.end(); | ||
}); |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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 Can you modify this example to generate the example values outside the loop? You 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.
You can follow this in
examples/index.js
as well.