顾名思义,我想在C中计算复数的立方根。 cbrt 不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include <cmath.h>
int main(){
double complex x, z = 1+2*I;
x = cbrt(z);
printf("z is %f + %fi \n", creal(z), cimag(z));
printf("x is %f + %fi \n", creal(x), cimag(x));
return(0);
}
输出如下。
z is 1.000000 + 2.000000i
x is 1.000000 + 0.000000i
答案 0 :(得分:1)
我会在数学堆栈交易所中查看这个answer。
基本上,您想计算Eurler公式的radius
和angle
。然后将radius
和angle
除以三(请参阅链接)。因此,首先您需要将复数转换为Euler格式。我现在没有时间弄清楚这一点,但是也许这给了您一个在哪里看的想法。
希望这会有所帮助!
加法:@squeamish可能是cpow的一个更好的主意,但正如他提到的那样,这只会返回一个根。
答案 1 :(得分:1)
cbrt不起作用。
该函数适用于实数值。 @squeamish ossifrage
x is 1.000000 + 0.000000i
是合理的结果。
double cbrt(double x);
cbrt
函数计算x
的实立方根。 C11dr§7.12.7.12
一个很好的编译器,带有以下报告的警告已完全启用。 节省时间,启用所有编译器警告。
// warning expected such as:
// warning: conversion to 'long double' from 'complex double' discards imaginary component [-Wconversion]
x = cbrt(z);
如何在C中计算复数的立方根?
<cmath.h>
不属于C标准库。在这里它的作用还不清楚。
代码可以使用double complex cpow(double complex, double complex);
x = cpow(z, 1.0/3.0);
...
// Ouptut
// x is 1.219617 + 0.471711i
我在标准库中找不到double complex ccbrt(double complex);
,也无法通过类型通用数学<tgmath.h>
访问一个。
...计算立方根...
此处强调复数“根”:计算所有'n'个根:
int n = 3;
const double complex two_pi_i = 2.0 * asin(-1.0) * I;
double complex rotate = cexp(two_pi_i / n);
x = cpow(z, 1.0 / 3.0);
for (int k = 0; k < n; k++) {
printf("x[%d] is % f + % fi \n", k, creal(x), cimag(x));
x *= rotate;
}
输出
x[0] is 1.219617 + 0.471711i
x[1] is 1.018322 + -0.820363i
x[2] is -0.201294 + -1.292075i