用卡丹公式解一元三次方程(x^3+px+q=0)(默认delta>0),p,q不全为正数时正常,一旦都为正数就会出现问题(例如p=1q=2结果应为-1但算出来是-1.526)
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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: