Skip to content

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
wants to merge 42 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
9df4fb1
feat: basic setup
aayush0325 Nov 12, 2024
a574281
feat: basic c files added
aayush0325 Nov 12, 2024
9aee3b0
feat: basic js files added
aayush0325 Nov 12, 2024
f0e76ad
feat: tests added
aayush0325 Nov 12, 2024
1dc1612
feat: docs added
aayush0325 Nov 12, 2024
accab3f
feat: examples added
aayush0325 Nov 12, 2024
89640dc
feat: benchmarks added
aayush0325 Nov 12, 2024
c67937b
feat: julia benchmark updated
aayush0325 Nov 12, 2024
2c47328
fix: example error in README
aayush0325 Nov 12, 2024
ccedb23
feat: updated c code using stdlib_base_maxf
aayush0325 Nov 12, 2024
193c5c7
feat: updated c code using stdlib_base_maxf
aayush0325 Nov 12, 2024
8d92eff
feat: updated tolerance for C tests
aayush0325 Nov 12, 2024
b933479
feat: code using maxf
aayush0325 Nov 12, 2024
f0bf2fe
feat: code using fmaxf
aayush0325 Nov 12, 2024
15e5d34
feat: updated tests for c files
aayush0325 Nov 12, 2024
6a21435
feat: updated test coverage
aayush0325 Nov 12, 2024
068956c
chore: stuff from code review
aayush0325 Nov 13, 2024
072e306
chore: stuff from code review
aayush0325 Nov 13, 2024
ed89c11
chore: stuff from code review
aayush0325 Nov 13, 2024
a054780
chore: stuff from code review
aayush0325 Nov 13, 2024
1d636a1
feat: updated code using stdlib_base_maxf
aayush0325 Nov 13, 2024
84b6d22
feat: updated tolerance in test.native.js to match test.js
aayush0325 Nov 13, 2024
7173f36
feat: updated data for tests
aayush0325 Nov 13, 2024
2a0601d
feat: updated data for tests
aayush0325 Nov 13, 2024
eac619c
feat: matching tolerance for js and c files
aayush0325 Nov 14, 2024
c9e68e6
chore: stuff from code review
aayush0325 Nov 16, 2024
5e99120
feat: tests with lowest possible tolerance
aayush0325 Nov 16, 2024
603897b
chore: stuff from code review
aayush0325 Nov 17, 2024
97cedfe
chore: stuff from code review
aayush0325 Nov 17, 2024
3153991
chore: stuff from code review
aayush0325 Nov 17, 2024
6812566
chore: pending changes
aayush0325 Nov 17, 2024
a775abb
feat: updated benchmarks with precomputation
aayush0325 Nov 17, 2024
e1e187a
chore: stuff from code review
aayush0325 Nov 18, 2024
6bbd6ee
Merge remote-tracking branch 'upstream/develop' into cinvf
stdlib-bot Nov 18, 2024
f7979ec
Merge remote-tracking branch 'upstream/develop' into cinvf
stdlib-bot Nov 28, 2024
dcfbf2a
docs: reorder variable declarations
gunjjoshi Dec 8, 2024
e70b3c1
docs: use correct function name
gunjjoshi Dec 8, 2024
bd17893
docs: update output values
gunjjoshi Dec 8, 2024
3448159
test: update tests
gunjjoshi Dec 8, 2024
61e9d32
Update package.json
gunjjoshi Dec 8, 2024
2b28783
feat: updated examples with precomputation
Dec 8, 2024
5cf999a
feat: updated test coverage
Dec 11, 2024
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
256 changes: 256 additions & 0 deletions lib/node_modules/@stdlib/math/base/special/cinvf/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
<!--

@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/array/uniform' );
var cinvf = require( '@stdlib/math/base/special/cinvf' );

var re;
var im;
var z1;
var z2;
var i;

re = uniform( 100, -50, 50 );
im = uniform( 100, -50, 50 );

for ( i = 0; i < 100; i++ ) {
z1 = new Complex64( re[ i % re.length ], im[ i % im.length ] );
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. [&lt;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 -->
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();
});
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();
});
Loading
Loading