c - 双自动舍入

标签 c math codeblocks math.h

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

打印后的控制台: The console after printing:

最佳答案

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

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

abs 函数返回一个整数,而 fabs 返回一个整数。

关于c - 双自动舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50126133/

相关文章:

c - 将结构写入二进制文件,然后读取文件并打印数据。

c - 2n 缩放整数的 16 位加法

c - 用C语言编写STM32L1系列的自定义bootloader

algorithm - Haskell 中 3 个实现的最高产品

c# - Math.Sin 给我的答案是错误的吗?

keyboard-shortcuts - 更改 Code::Blocks 中的 IDE 快捷方式

python - 使用 subprocess.call 实时读取 c 可执行打印语句的输出

mySQL计算行的乘积

c++ - 这个 "int logprintf( const char* ptr, ... )"是做什么的?

c - 在 Windows 10 Pro 上使用 CodeBlocks 在 C 中计算伯努利 nTh 数的最佳方法