c语言解一元三次方程

用卡丹公式解一元三次方程(x^3+px+q=0)(默认delta>0),p,q不全为正数时正常,一旦都为正数就会出现问题(例如p=1q=2结果应为-1但算出来是-1.526)

img

a开3次方的结果b为
b=power(fabs(a),1.0/3.0);
if(a<0) b=-b;

所以,你应该对x的两项分别求符号。

#include<stdio.h>
#include<math.h>                                             
int main()
{
  int p, q;
  double x, k, m, a, b;
  scanf("%d%d", &p, &q);
  m = pow(q / 2.0, 2) + pow(p / 3.0, 3);
  k = sqrt(m);
  a = -q / 2. + k;
  b = -q / 2.0 - k;
  if (a > 0)
    a = pow(fabs(a), 1.0 / 3.0);
  else
    a = -pow(fabs(a), 1.0 / 3.0);
  if (b > 0)
    b = pow(fabs(b), 1.0 / 3.0);
  else
    b = -pow(fabs(b), 1.0 / 3.0);
  x = a + b;
  printf("%.7f\n", x);
  printf("%.7f\n", x*x*x+p*x+q);//检验
  return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^