Вопрос по программе

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

Приветствую вас дамы и господа :)
Тут такое дело...



C++:
# include <iostream.h>
# include <conio.h>
# include <math.h>

// Считает значение функции
float Schet_F(float X)
{
if (X + 5 < 0) return 1/(2 * X) - 10;
else return (X - sin(X)) / X;
}

// Херачит цикл и выводит табулирование
void While_F (float X_s, float X_e, float X_st)
{
while (X_s <= X_e)
{
if (X_s != 0)
{
cout<< "x= "<< X_s<< "  ";
cout<< "F(x)= "<< F(X_s)<< endl;
X_s = X_s + X_st;
}
}
}

// Майн...ну что тут сказать...
void main(void)
{
clrscr();
float X_start, X_end, step_X;
cout<< "X_start= "; cin>> X_start;
cout<< "X_end= "; cin>> X_end;
cout<< "step_X= "; cin>> step_X;
While_F(X_start, X_end, step_X);
getch();
}


Результат:


Вопросы:
- Почему когда Х должен быть равен -0,1 он равен -0,099999 ?
- Почему выводится Х, когда он равен нулю?
- Почему не выводится конечное значение Х (последняя строка)?
 
G

Guest

Ой...извеняюсь. не туда, видать, написал :)
 
T

Trs

Вопросы:
- Почему когда Х должен быть равен -0,1 он равен -0,099999 ?
- Почему выводится Х, когда он равен нулю?
- Почему не выводится конечное значение Х (последняя строка)?
Потому что 0.1 в двоичной системе счисления это бесконечная периодическая дробь 0.0(0011). Ты используешь тип float, то есть дробь будет обрезаться после 23 знаков и будет на самом деле чуть большее чем 0.1. После нескольких сложений эта ошибка накапливается и ты видишь число -0,099999. По этой же причине после 10 сложений ты получишь не 0, а в конце не получишь в точности X_e.

Общее правило - работая с вещественными числами никогда не надейся на точное равенство.

Между прочим из-за такой же ошибки в свое время погибло 28 американских солдат:
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!