4

I need to compute imaginary exponential in C.

As far as I know, there is no complex number library in C. It is possible to get e^x with exp(x) of math.h, but how can I compute the value of e^(-i), where i = sqrt(-1)?

apaderno
  • 26,733
  • 16
  • 74
  • 87
Erkan Haspulat
  • 11,342
  • 6
  • 39
  • 45

7 Answers7

16

In C99, there is a complex type. Include complex.h; you may need to link with -lm on gcc. Note that Microsoft Visual C does not support complex; if you need to use this compiler, maybe you can sprinkle in some C++ and use the complex template.

I is defined as the imaginary unit, and cexp does exponentiation. Full code example:

#include <complex.h>
#include <stdio.h>

int main() {
    complex x = cexp(-I);
    printf("%lf + %lfi\n", creal(x), cimag(x));
    return 0;
}

See man 7 complex for more information.

Thomas
  • 162,537
  • 44
  • 333
  • 446
8

Note that exponent of complex number equals:

e^(ix) = cos(x)+i*sin(x)

Then:

e^(-i) = cos(-1)+i*sin(-1)
apaderno
  • 26,733
  • 16
  • 74
  • 87
Vladimir
  • 169,112
  • 36
  • 383
  • 312
6

Using the Euler's Formula you have that e^-i == cos(1) - i*sin(1)

Jack
  • 128,551
  • 28
  • 227
  • 331
2

e^-j is just cos(1) - j*sin(1), so you can just generate the real and imaginary parts using real functions.

Paul R
  • 202,568
  • 34
  • 375
  • 539
1

Just use the cartesian form

if z = m*e^j*(arg);

re(z) = m * cos(arg);
im(z) = m * sin(arg);
Tom
  • 41,802
  • 29
  • 133
  • 165
1

Is calling a c++ function a solution for you? The C++ STL has a nice complex-class and boost also has to offer some nice options. Write a function in C++ and declare it "extern C"

extern "C" void myexp(float*, float*);

#include <complex>

using std::complex;

void myexp (float *real, float *img )
{
  complex<float> param(*real, *img);
  complex<float> result = exp (param);
  *real = result.real();
  *img = result.imag();
}

Then you can call the function from whatever C-code you rely on ( Ansi-C, C99, ...).

#include <stdio.h>

void myexp(float*, float*);

int main(){
    float real = 0.0;
    float img = -1.0;
    myexp(&real, &img);
    printf ("e^-i = %f + i* %f\n", real, img);
    return 0;
}
Lucas
  • 13,039
  • 12
  • 58
  • 90
0

In C++ it can be done directly:

std::exp(std::complex<double>(0, -1));
phuclv
  • 32,499
  • 12
  • 130
  • 417