双自动舍入

Double automatic rounding

我正在开发一个程序,用塔尔塔利亚的方法计算三次方程的根。问题是当我打印虚部的值时,程序将 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;
}

打印后的控制台:

abs的用法改为fabs,结果为:

As raízes são: <-1.650629>, <-0.174685 + 1.546869i>, <-0.174685 - 1.546869i>

函数 abs returns 一个整数,而 fabs 适用于双精度数。