如何计算C中复数的立方根?

时间:2018-07-18 09:10:11

标签: c

顾名思义,我想在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

2 个答案:

答案 0 :(得分:1)

我会在数学堆栈交易所中查看这个answer

基本上,您想计算Eurler公式的radiusangle。然后将radiusangle除以三(请参阅链接)。因此,首先您需要将复数转换为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