我正在开发一个用Tartaglia方法计算三次方程根的程序。问题是当我打印虚部的值时,程序将1.54686889的值四舍五入为1.50。
我曾尝试使用float而不是double,但是没有成功。 我正在使用Code :: Blocks 17.12
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#define PI 3.14159265359
int main(void)
{
setlocale(LC_ALL,"");
double a, b, c, d, p, q, r, t, u, u3, v, v3, A, B, C, D, M, x1, x2, x2i, x3, x3i;
printf("Insira os coeficientes (a b c d): ");
scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
//Verifica se o coeficiente a é válido
if(a != 0){
printf("\nForma geral:\n");
printf("\n (%.2lf)x³ + (%.2lf)x² + (%.2lf)x + (%.2lf) = 0 \n", a, b, c, d);
A = b/a;
B = c/a;
C = d/a;
p = B - (pow(A, 2.0)/3.0);
q = C - ((A*B)/3.0) + (2.0*pow(A, 3.0))/27.0;
D = (pow(q, 2.0)/4.0) + (pow(p, 3.0)/27.0);
if(D < 0){
M = pow(-1.0*D, 1.0/2.0);
r = sqrt(pow(q, 2.0)/4.0 + pow(M, 2.0));
t = acos(-1.0*q/2.0/r);
x1 = 2.0 * pow(r, 1.0/3.0) * cos(t/3.0) - A/3.0;
x2 = 2.0 * pow(r, 1.0/3.0) * cos((t + 2.0 * PI)/3.0) - A/3.0;
x3 = 2.0 * pow(r, 1.0/3.0) * cos((t + 4.0 * PI)/3.0) - A/3.0;
printf("\nAs raízes são: <%lf> <%lf> <%lf>\n", x1, x2, x3);
}
else{
u3 = (-1.0*q/2.0) + pow(D, 1.0/2.0);
if(u3 < 0)
u = -1.0 * pow(-1.0*u3, 1.0/3.0);
else
u = pow(u3, 1.0/3.0);
v3 = (-1.0*q/2.0) - pow(D, 1.0/2.0);
if(v3 < 0)
v = -1.0 * pow(-1.0*v3, 1.0/3.0);
else
v = pow(v3, 1.0/3.0);
x1 = u + v - A/3.0;
D = pow((A + x1), 2.0) + (4.0*C/x1);
x2 = -1.0 * (A + x1)/2.0;
x2i = pow(abs(D), 1.0/2.0)/2.0;
x3 = x2;
x3i = x2i;
if(D < 0){
printf("\nAs raízes são: <%lf>, <%lf + %lfi>, <%lf - %lfi>\n", x1, x2, x2i, x3, x3i);
}
else{
x2 = x2 + x2i;
x3 = x3 - x3i;
printf("\nAs raízes são: <%lf>, <%lf>, <%lf>\n", x1, x2, x3);
}
}
}
else{
printf("O coeficiente <a> não pode ser igual a 0!\n");
}
printf("Fonte de pesquisa: http://www.matematicando.net.br/metodo-de-tartaglia-para-obter-raizes-de-equacao-do-3o-grau/\n");
system("pause");
return 0;
}
答案 0 :(得分:3)
将abs
的使用更改为fabs
,结果为:
As raízes são: <-1.650629>, <-0.174685 + 1.546869i>, <-0.174685 - 1.546869i>
函数abs
返回一个整数,而fabs
适用于双精度。