Skip to content

Latest commit

 

History

History

README.md

cinvf

Compute the inverse of a single-precision complex floating-point number.

The inverse (or reciprocal) of a non-zero complex number z = a + bi is defined as

$${\frac {1}{z}}=\frac{\bar{z}}{z{\bar{z}}} = \frac{a}{a^{2}+b^{2}} - \frac{b}{a^2+b^2}i.$$

Usage

var cinvf = require( '@stdlib/math/base/special/cinvf' );

cinvf( z )

Computes the inverse of a single-precision complex floating-point number.

var Complex64 = require( '@stdlib/complex/float32/ctor' );

var v = cinvf( new Complex64( 2.0, 4.0 ) );
// returns <Complex64>[ ~0.1, ~-0.2 ]

Examples

var Complex64Array = require( '@stdlib/array/complex64' );
var uniform = require( '@stdlib/random/array/uniform' );
var logEachMap = require( '@stdlib/console/log-each-map' );
var cinvf = require( '@stdlib/math/base/special/cinvf' );

// Create an array of random numbers:
var arr = new Complex64Array( uniform( 200, -100.0, 100.0 ) );

// Compute the inverse of each number in the array:
logEachMap( '1.0 / (%s) = %s', arr, cinvf );

C APIs

Usage

#include "stdlib/math/base/special/cinvf.h"

stdlib_base_cinvf( z )

Computes the inverse of a single-precision complex floating-point number.

#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.
stdlib_complex64_t stdlib_base_cinvf( const stdlib_complex64_t z );

Examples

#include "stdlib/math/base/special/cinvf.h"
#include "stdlib/complex/float32/ctor.h"
#include "stdlib/complex/float32/reim.h"
#include <stdio.h>

int main( void ) {
    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 );
    }
}

References

  • Smith, Robert L. 1962. "Algorithm 116: Complex Division." Commun. ACM 5 (8). New York, NY, USA: ACM: 435. doi:10.1145/368637.368661.
  • 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.
  • 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.
  • 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>.

See Also