Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/55: Рейтинг темы: голосов - 55, средняя оценка - 4.73
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285

При выводе числа выводится #INF

08.12.2014, 20:47. Показов 10415. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, задали написать программу вычисления кубического уравнения. В сети нашёл алгоритм решения (ссыль, который можно спокойно использовать СИ++ без гиперболических функций (Привет формуле Виета).

Все написал, ошибок не выдаёт при компиляции, но вот при вводе любых значений выводится #INF. Поискал, написано , что в большинстве связано с делением на ноль, но таких ошибок, мной допущено не было в написании, вроде.

Посмотрите, может где увидите ошибку (И если нашли и справили, поставьте комментарий, хочу посмотреть, где ошибся)
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <math.h>
 
using namespace std;
 
int main()
{
 double A,B;
 double a,b,c,d;
 int r;
 cout<<"ax^3+bx^2+cx+d=0"<<endl;
     cout<<"Vvedite a: ";
           cin>>a;
     cout<<"Vvedite b: ";
           cin>>b;                         
     cout<<"Vvedite c: ";
           cin>>c;                                      
     cout<<"Vvedite d: ";
           cin>>d;
     cout<<"\n";      
     //Избавляемся от коэф. перед x^3
         a=b/a;
         b=c/a;
         c=d/a;
         
     //Вычисляем Q и R для метода Виета-Кордано
         double Q = (a*a-3.0*b)/9.0;
         double R = (2.0*a*a*a-9.0*a*b+27.0*c)/54;
         
     /*Сравните полученные значения R и Q. 
Если верно выражение Q³ >R² , следовательно, 
в исходном уравнении присутствуют 3 действительных корня. 
Вычислите их по формулам Виета.*/
 
         if ((Q*Q*Q)>(R*R))
            {
              cout<<"Q^3 > R^2, znachit imeem 3 deistvitelnih kornya"<<endl;
              double t = (acos(R/sqrt(Q*Q*Q)))/3.0;
                  double x1 = -2.0 * sqrt(Q) * cos(t) - a/3.0;
                  double x2 = -2.0 * sqrt(Q) * cos(t+(2*M_PI/3.0))-a/3.0;
                  double x3 = -2.0 * sqrt(Q) * cos(t-(2*M_PI/3.0))-a/3.0;
              
              cout<<"x1= "<<x1<<endl;
              cout<<"x2= "<<x2<<endl;
              cout<<"x3= "<<x3<<endl;             
                           }
     /* При значениях Q³ <= R² , в решении находится один действительный корень х1 
и два комплексно-сопряженных корня. Для их определения нужно 
найти промежуточные значения А и В. Вычислите их по формулам Кардано.*/
           if ((Q*Q*Q)<=(R*R))
              {
               if (R>0) r=1;
               if (R<0) r=-1;
               if (R=0) r=0;
             A =-r*pow((fabs(R)+sqrt(R*R-Q)), 1/3);
                    if (A=0){B=0;} else B=Q/A;
              
              if (A!=B)
              {      
                double x1 = (B+A)-a/3.0;
                double x23_1 = -(A+B)/2.0+a/3.0;
                double x23_2 = sqrt(3.0)*(A-B)/2.0;
                       cout<<"x1= "<<x1<<endl;
                       cout<<"x2= "<<x23_1<<"+i*"<<x23_2<<endl;
                       cout<<"x3= "<<x23_1<<"-i*"<<x23_2<<endl;
           
                } else
                      {
                       double x1 = (B+A)-a/3.0;
                       double x2 = -A-a/3.0;
                              cout<<"x1= "<<x1<<endl;
                              cout<<"x2= "<<x2<<endl;           
                      }
                                     
                              }
      system ("pause");     
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2014, 20:47
Ответы с готовыми решениями:

При выводе числа выводится #INF - C++
Вообщем ,задали написать программу для вычисления значений функции для нескольких значений аргумента. Все написала, ошибок не выдаёт при...

При выводе числа выводится #INF
может кто обьяснить где тут проблема? задача - есть два метода исчисления одна функцией другая суммой нужно посчитать по ним и вывести...

Почему при выводе значения переменной выводиться inf?
При выводе z выводится inf #include &lt;iostream&gt; void main() { double n, b, x, y, z; n = 2; b = -0, 12; x = 1, 3 *...

25
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
08.12.2014, 20:51
Цитата Сообщение от Frip Посмотреть сообщение
A =-r*pow((fabs(R)+sqrt(R*R-Q)), 1/3);
ошибка номер раз: 1/3 = 0. Либо 1.0 / 3, либо 1 / 3.0, либо 1.0 / 3.0
1
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
08.12.2014, 21:01  [ТС]
Исправил, но результат тот же
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
08.12.2014, 21:04
Цитата Сообщение от Frip Посмотреть сообщение
if (R=0) r=0;
Как по Вашему, чему равно R после присваивания R=0 ????
Соответственно sqrt(R*R-Q)) - корень из отрицательного числа.
1
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
08.12.2014, 21:11  [ТС]
Увлекся, забыл еще одно равно поставить, сравнение же.
Исправил, но ничего не изменилось.

Ах да, это я так коряво сигнум прописывал
C++
1
2
3
if (R>0) r=1;
if (R<0) r=-1;
if (R==0) r=0;
0
91 / 74 / 81
Регистрация: 07.12.2014
Сообщений: 303
08.12.2014, 21:16
C++
1
if (A=[B]=[/B]0){B=0;} else B=Q/A;
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
08.12.2014, 21:26  [ТС]
Конструкцию эту не использую, но то что опять знак равно пожалел, это я понял)

Добавлено через 2 минуты
Всё, от знака бесконечности избавился, теперь ответы не сходятся
В учебнике описаны формулы решения, но там с гиперболическими функциями, как и и по тригонометрической формуле Виета.
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
08.12.2014, 21:30  [ТС]
Может кому интересно будет, вот прописаны формулы в учебнике, всё бы ничего, но эти sh и ch...
Миниатюры
При выводе числа выводится #INF   При выводе числа выводится #INF  
0
91 / 74 / 81
Регистрация: 07.12.2014
Сообщений: 303
08.12.2014, 21:46
а что смущаетв гиперболических синусах косинусах?
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
08.12.2014, 22:12  [ТС]
То что встроенных в math.h их нет. Я думал ладно, попробую выразить:

ch x = (exp(x)+exp(-x))/2;
sh x = (exp(x)-exp(-x))/2;

Но вот в учебнике указаны , как выражены фи, например:

ch(phi) = q/R^3

Опять же, думал вместо ch, использовать первые формулы, но вот выражать из степени x - замучаешься, да и с тригонометрией у меня не очень. Завтра у препода совета спрошу, мб поможет чем)
0
91 / 74 / 81
Регистрация: 07.12.2014
Сообщений: 303
08.12.2014, 22:13
sinh() & cosh() функции из math.h
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
09.12.2014, 13:25  [ТС]
Аллилуя! Спасибо большое мил человек!

Добавлено через 4 часа 40 минут
В общем, переписал программу, по условиям учебника, но ответы не сходятся (проверял на вольфраме и других онлайн-калькуляторах) да и числа записываются как "15424е-175"
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <math.h>
 
using namespace std;
 
int main()
{
 const double PI=3.14159265358979323846;
 double A,B;
 double a,b,c,d;
 int r,q1;
 cout<<"ax^3+bx^2+cx+d=0"<<endl;
     cout<<"Vvedite a: ";
           cin>>a;
     cout<<"Vvedite b: ";
           cin>>b;                         
     cout<<"Vvedite c: ";
           cin>>c;                                      
     cout<<"Vvedite d: ";
           cin>>d;
     cout<<"\n";    
     
     double p = (3.0*a*c - b*b)/(9.0*a*a);
     double q = (b*b*b)/(27.0*a*a*a)-(b*c)*(6.0*a*a)+d/(2.0*a); //
            double q2=q*q;
            double p3=p*p*p;
            
      /* 1 */ if (p==0)
               {
                double y123 = pow(-2.0*q, 1.0/3.0);
                cout<<"x1= "<<y123<<endl;
                cout<<"x2= "<<y123<<endl;
                cout<<"x3= "<<y123<<endl;
                     }
            
                    
 /* 2 */   if (q==0)
            {
              if (p<=0)        
               {     
                double y1 = 0;
                double y2 = sqrt(-3.0*p);
                double y3 = -1.0*sqrt(-3.0*p);
                       cout<<"x1 = "<<y1<<endl;
                       cout<<"x2 = "<<y2<<endl;
                       cout<<"x3 = "<<y3<<endl;    
                     } else
                       {
                         double y1=0;
                         double y23 = sqrt(3.0*p);
                                cout<<"x1 = "<<y1<<endl;
                                cout<<"x2 = i * "<<y23<<endl;
                                cout<<"x3 = -i * "<<y23<<endl;   
                           }
              } 
              
 /* 3 */ if ((p<0)and(q!=0)and((q2+p3)<=0))
                 {
                        if (q==0) q1=0;
                        if (q>0) q1=1;
                        if (q<0) q=-1;
                                                                             
                   double r = q1*sqrt(fabs(p));                             
                   double phi = acos(q/pow(r, 3.0));
                          
                          double y1 = -2.0*r*cos(phi/3.0);
                          double y2 = 2.0*r*cos((PI-phi)/3.0);
                          double y3 = 2.0*r*cos((PI+phi)/3.0); 
                                 cout<<"x1 = "<<y1<<endl;
                                 cout<<"x2 = "<<y2<<endl;
                                 cout<<"x3 = "<<y3<<endl;                                       
                 }
              
      /* 4 */if ((p<0)and(q!=0)and((q2+p3)>0))
                 {
                           double r = q1*sqrt(fabs(p));
                           double phi = acosh(cosh(q/pow(r, 3.0)));
                                                                             
                   double y1 = -2.0*r*cosh(phi/3.0);
                   double y23_1 = r*cosh(phi/3.0);
                   double y23_2 = sqrt(3.0)*r*sinh(phi/3.0);
                          cout<<"x1 = "<<y1<<endl;
                          cout<<"x2 = "<<y23_1<<" + i * ("<<y23_2<<")"<<endl;
                          cout<<"x3 = "<<y23_1<<" - i * ("<<y23_2<<")"<<endl;
                 }
              
              if ((p>0)and(q!=0))
                 {
                           double r = q1*sqrt(fabs(p));
                           double phi = asinh(sinh(q/pow(r, 3.0)));
                 double y1 = -2.0*r*sinh(phi/3.0);
                 double y23_1 = r*sinh(phi/3.0);
                 double y23_2 = sqrt(3)*cosh(phi/3.0);
                          cout<<"x1 = "<<y1<<endl;
                          cout<<"x2 = "<<y23_1<<" + i * ("<<y23_2<<")"<<endl;
                          cout<<"x3 = "<<y23_1<<" - i * ("<<y23_2<<")"<<endl;                                            
                 }
 
system ("pause");                     
}


Вроде условия верно проставлены, но может вы найдете какой-нибудь недочёт.

Заранее Спасибо!

П.С. Условие из учебника
0
91 / 74 / 81
Регистрация: 07.12.2014
Сообщений: 303
09.12.2014, 14:19
то, что нашла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <math.h>
int sign(double x)
{
    if (x > 0) return 1;
    else
        if (x < 0) return -1;
        else return 0;
 
}
using namespace std;
 
int main()
{
    const double PI = 3.14159265358979323846;
    double A, B,r,phi;
    double a, b, c, d;
    int r, q1;
    cout << "ax^3+bx^2+cx+d=0" << endl;
    cout << "Vvedite a: ";
    cin >> a;
    cout << "Vvedite b: ";
    cin >> b;
    cout << "Vvedite c: ";
    cin >> c;
    cout << "Vvedite d: ";
    cin >> d;
    cout << "\n";
 
    double p = (3.0*a*c - b*b) / (9.0*a*a);
    double q = (b*b*b) / (27.0*a*a*a) - (b*c)/(6.0*a*a) + d / (2.0*a); //
    double q2 = q*q;
    double p3 = p*p*p;
 
    /* 1 */ if (p == 0)
    {
        double y123 = pow(-2.0*q, 1.0 / 3.0);
        cout << "x1= " << y123 << endl;
        cout << "x2= " << y123 << endl;
        cout << "x3= " << y123 << endl;
    }
 
 
    /* 2 */   if (q == 0)
    {
        if (p <= 0)
        {
            double y1 = 0;
            double y2 = sqrt(-3.0*p);
            double y3 = -1.0*sqrt(-3.0*p);
            cout << "x1 = " << y1 << endl;
            cout << "x2 = " << y2 << endl;
            cout << "x3 = " << y3 << endl;
        }
        else
        {
            double y1 = 0;
            double y23 = sqrt(3.0*p);
            cout << "x1 = " << y1 << endl;
            cout << "x2 = i * " << y23 << endl;
            cout << "x3 = -i * " << y23 << endl;
        }
    }
 
    /* 3 */ if ((p<0)&&(q != 0)&&((q*q + p*p*p) <= 0))
    {
        r =sign(q)*sqrt(fabs(p));
        phi = acos(q / pow(r, 3.0));
 
        double y1 = -2.0*r*cos(phi / 3.0);
        double y2 = 2.0*r*cos((PI - phi) / 3.0);
        double y3 = 2.0*r*cos((PI + phi) / 3.0);
        cout << "x1 = " << y1 << endl;
        cout << "x2 = " << y2 << endl;
        cout << "x3 = " << y3 << endl;
    }
 
    /* 4 */if ((p<0) && (q != 0) && ((q*q + p*p*p) >0))
    {
        r = sign(q)*sqrt(fabs(p));
        phi = log(q / (r*r*r) - sqrt(pow(q / (r*r*r),2)-1));
        
        double y1 = -2.0*r*cosh(phi / 3.0);
        double y23_1 = r*cosh(phi / 3.0);
        double y23_2 = sqrt(3.0)*r*sinh(phi / 3.0);
        cout << "x1 = " << y1 << endl;
        cout << "x2 = " << y23_1 << " + i * (" << y23_2 << ")" << endl;
        cout << "x3 = " << y23_1 << " - i * (" << y23_2 << ")" << endl;
    }
 
    if ((p>0)&&(q != 0))
    {
        r = q1*sqrt(fabs(p));
        phi = log(q / (r*r*r) - sqrt(pow(q / (r*r*r), 2) + 1));
        double y1 = -2.0*r*sinh(phi / 3.0);
        double y23_1 = r*sinh(phi / 3.0);
        double y23_2 = sqrt(3)*cosh(phi / 3.0);
        cout << "x1 = " << y1 << endl;
        cout << "x2 = " << y23_1 << " + i * (" << y23_2 << ")" << endl;
        cout << "x3 = " << y23_1 << " - i * (" << y23_2 << ")" << endl;
    }
 
    system("pause");
}
1
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
09.12.2014, 19:36  [ТС]
Подставил, теперь вместе с числами выводит #IND.
И зачем вы в 4-5 цикле сменили нахождение фи через логирфм, ведь нормально было вроде

Не по теме:

Если не затруднит, и не забыли, в каких именно строках ошибки были?

0
91 / 74 / 81
Регистрация: 07.12.2014
Сообщений: 303
09.12.2014, 19:46
там в 3 и 4 пункту фи считается подругому, чем во 2 пункте
31 строчка, у Вас в коде во втором слагаемом умножалось, а по формуле делится
В 65 строчке и всех нижестоящих похожих меняла "and" на "&&"
в 4 и 5 пункте меняла вычисления фи
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
09.12.2014, 19:52  [ТС]
вроде выраженно через acosh(cosh())

Добавлено через 6 минут
Насчёт фи, распишу для каждого случая

3) phi = arccos q/r^3
C++
1
phi = acos (q/(pow(r, 3.0)
4) ch phi = q/r^3
C++
1
phi = acosh(cosh(q/pow(r, 3.0)))
5) sh phi = q/r^3
C++
1
phi = asinh(sinh(q/pow(r, 3.0)))
Вроде всё правильно выразил. У препода спрашивал, говорит что все правильно вроде, да и на вольфраме проверял (взял sinh(1), выдал число, я это число подставил вместо икс в arcsinh(x), и опять выдало единицу)
0
91 / 74 / 81
Регистрация: 07.12.2014
Сообщений: 303
09.12.2014, 19:53
Я налажала немного, 81 и 94 там знак сложения, а не вычитания в аргументе логарифма
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
09.12.2014, 19:56  [ТС]
так зачем применять логаримф, если через asinh(sinh()) acosh(cosh(()) нормально должно выходить
0
91 / 74 / 81
Регистрация: 07.12.2014
Сообщений: 303
09.12.2014, 20:04
не знала я про них) нашла через логарифм
но это сути не меняет
ну, кроме того, что знак под логарифмом не тот
C++
1
phi = acos (q/(pow(r, 3.0));
0
3 / 3 / 1
Регистрация: 04.11.2013
Сообщений: 285
09.12.2014, 20:21  [ТС]
Не понял, всмысле "не тот"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2014, 20:21
Помогаю со студенческими работами здесь

Найдите в чем моя ошибка, если при отладке в ответе выводится inf
#include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); double i=0, j=1, eps,...

При возведении в степень выводится результат "1.#INF"
При значении &quot;k&quot; больше 4 выводит значение 1.#INF. Как можно это исправить? #include&quot;stdafx.h&quot; #include&lt;iostream&gt; ...

Считывание из файла в char - при выводе выводится лишнее
Считываю из файла в строку типа char, если у меня в строке меньше 16 символов, то при выводе выводится какой-то мусор, наверное связано с...

Выводится мусор при выводе массива в обратном порядке
Дайте пожалуйста объяснение багу, высочившемуся у меня во время выполнения следующего задания: вывести массив из n элементов в обратном...

При выводе на экран переменной string выводится набор левых символов
int main() { int s; string b; printf(&quot;DEC: &quot;); scanf(&quot;%i&quot;, &amp;s); for (int i = 31; i &gt;= 0; i--) { s += (char)(((b &gt;&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru