|
|
|
| Здравствуйте, участники форума!
Изучая С++ прочитал следующие строки:
Многие десятичные значения не могут быть представлены точно в двоичной форме с плавающей точкой, поэтому в аккумулируемых значениях может накапливаться погрешность. Это значит, что вы не должны кодировать цикл for так, чтобы его завершение зависело от достижения счетчиком с плавающей точкой точного значения. Например, следующий неправильно спроектированный цикл никогда не завершится:
for(double x = 0.0; x != 1.0; x += 0.2)
cout << x;
|
Становится как-то не по себе от такой информации.
Я написал вот такой небольшой код:
#include <iostream>
using std::endl;
using std::cout;
using std::cin;
int main()
{
double number = 0.0;
double sum = 0.0;
for(;;)
{
cout << endl << "Enter number (for exit enter 0): ";
cin >> number;
if(number == 0)
break;
sum += number;
}
cout << endl << "Sum = " << sum << endl;
return 0;
}
|
...и вспомнил об вышеизложенном предупреждении и немного засомневался в понимании правильности написанного мною условия if.
Объясню почему:
Если в двоичной форме тип double не может быть представлен точно, то возможна ли погрешность в представлении значения "0.0"? Будет ли выполняться равенство 0.0 == 0 после того как компилятор приведет тип int нуля к типу double (ну или после явного приведения)? | |
|
|
|
|
|
|
|
для: Mr.Jeweller
(27.09.2010 в 15:07)
| | Дайте пожалуйста и правильный вариант цикла для данного случая. Использую подобные конструкции частенько, возможно из за этого у меня в программах баги возникают(выполняются не так как задуманно)? | |
|
|
|
|
|
|
|
для: Miha_drinking_bout
(30.09.2010 в 12:43)
| | Совет от автора книги таков, что надо писать условие цикла так:
for(double x = 0.0; x <= 2.0; x += 0.25)
{
// операторы;
}
|
Но иногда приходится сравнивать операцией "==" и тут я не уверен, будет ли 0 равен 0.0 после приведения. | |
|
|
|