Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2015, 00:11   #1
PunyFlash
Новичок
Джуниор
 
Регистрация: 01.10.2015
Сообщений: 1
По умолчанию Кубическое уравнение методом Кардано

Здравствуйте! При выводе корней уравнения не всегда выводятся коректные значения (Например: при вводе нулевых коефициентов вылазит -1.#IND00 и -0.00000). Прошу помочь разобратся

Код:
#include <stdio.h>
#include <math.h>

int Cubic(double *x, double a, double b, double c) 
{
    double p, q, d;
    p=b-(a*a/3.);
    q=(2.*a*a*a/27.)-(a*b/3.)+c;
    d=(p*p*p/27.)+(q*q/4.);

    if(d>0)
    {
        double u, v, ut;
        ut=-q/2+sqrt(d);
        u=(ut>0) ? (pow(ut,1/3.)) : (pow(fabs(ut),1/3.)*-1);
        v=p/(-3.*u);

        x[0]=u+v-(a/3.);
        x[1]=((u+v)/-2.)-(a/3.);
        x[2]=fabs((sqrt(3.)*(u-v))/2.);
        return 1;
    }
    
    if(d==0)
    {
        x[0]=(3.*q/p)-(a/3.);
        x[1]=-(3.*q/2.*p)-(a/3.);
        x[2]=x[1];
        return 2;
    }
    
    if(d<0)
    {
        double r, fi;
        r=sqrt(-pow(p,3.)/27.);
        fi=acos(-q/(2.*r));

        x[0]=2.*fabs(pow(r,1/3.))*cos(fi/3.);
        x[1]=2.*fabs(pow(r,1/3.))*cos((fi+2.*M_PI)/3.);
        x[2]=2.*fabs(pow(r,1/3.))*cos((fi+4.*M_PI)/3.);
        return 3;
    }
    return 0;
}

int main()
{
    double x[3];
    double s[3];
    const char *index[] = {"\nPrint a: ", "Print b: ", "Print c: "};
    printf("Enter coefficients a, b, c of equation x^3+ax^2+bx+c=0\n");
    for(int i = 0; i<3; i++)
    {
        printf("%s", index[i]);
        if(scanf("%lf", &s[i])!=1)
        {
            printf("Vrong value! Please, print correct coefficients."); fflush(stdin); i-=1; continue;
        }
        else
        {
            if (getchar()!='\n')
            {
                printf("Please, enter 1 number each line and do not use wrong symbols\n");
                i-=1;
                fflush(stdin);
                continue;
            }
        }
    }
    
    switch (Cubic(x, s[0],s[1],s[2]))
    {
        case 1: printf("\nx1 = %lf\nComplex roots:\nx2 = %lf+i*%lf\nx3 = %lf-i*%lf\n", x[0], x[1], x[2], x[1], x[2]); break;
        case 2: printf("\nx1 = %lf\nx2 = %lf\n", x[0], x[1]); break;
        case 3: printf("\nApproximate roots:\nx1 = %lf\nx2 = %lf\nx3 = %lf\n", x[0], x[1], x[2]); break;
    }
    return 0;

}

Последний раз редактировалось PunyFlash; 01.10.2015 в 00:20.
PunyFlash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
квадратное уравнение методом Хорд и методом касательных Pomio1 Помощь студентам 1 24.11.2011 00:37
Кубическое уравнение на Pascale evgeniyhbk Помощь студентам 12 21.09.2011 15:35
уравнение x=f(x) методом касательный и методом хорд в делфи electrovolk Помощь студентам 0 30.12.2010 00:06
уравнение методом итераций Golovastik Общие вопросы Delphi 2 22.06.2009 15:57