Двойное автоматическое округление - PullRequest
0 голосов
/ 02 мая 2018

Я разрабатываю программу, которая вычисляет корни кубического уравнения по методу Тарталья. Проблема в том, что когда я печатаю значение мнимой части, программа округляет значение от 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:

1 Ответ

0 голосов
/ 02 мая 2018

Измените использование abs на fabs, и результат будет:

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

Функция abs возвращает целое число, тогда как fabs работает с двойными числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...