Вычисление е ^ (- J) в C - PullRequest
4 голосов
/ 14 мая 2010

Мне нужно вычислить мнимую экспоненту в C.

Насколько я знаю, в C. нет библиотеки комплексных чисел. Можно получить e^x с exp(x) из math.h, но как я могу вычислить значение e^(-i), где i = sqrt(-1)

Ответы [ 7 ]

15 голосов
/ 14 мая 2010

В C99 есть тип complex. Включить complex.h; вам может понадобиться ссылка с -lm на gcc. Обратите внимание, что Microsoft Visual C не поддерживает complex; если вам нужно использовать этот компилятор, возможно, вы можете посыпать немного C ++ и использовать шаблон complex.

I определяется как мнимая единица, а cexp - возведение в степень. Пример полного кода:

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

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

См. man 7 complex для получения дополнительной информации.

7 голосов
/ 14 мая 2010

Обратите внимание, что показатель комплексного числа равен:

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

Тогда:

e^(-i) = cos(-1)+i*sin(-1)
6 голосов
/ 14 мая 2010

Используя формулу Эйлера , вы получите e^-i == cos(1) - i*sin(1)

2 голосов
/ 14 мая 2010

e^-j это просто cos(1) - j*sin(1), так что вы можете просто генерировать реальные и мнимые части, используя реальные функции.

1 голос
/ 14 мая 2010

Является ли вызов функции c ++ для вас решением? C ++ STL имеет хороший сложный класс, и boost также предлагает несколько приятных опций. Написать функцию на C ++ и объявить ее "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();
}

Затем вы можете вызывать функцию из любого C-кода, на который вы полагаетесь (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;
}
1 голос
/ 14 мая 2010

Просто используйте декартову форму

если z = m*e^j*(arg);

re(z) = m * cos(arg);
im(z) = m * sin(arg);
0 голосов
/ 24 сентября 2013

В C ++ это можно сделать напрямую: std :: exp (std :: complex (0, -1));

...