Использование «double» в качестве переменных счетчика в циклах

В книге, которую я сейчас читаю, есть этот отрывок:

Вы также можете использовать числа с плавающей запятой значение как счетчик цикла. Вот пример цикла for с таким типом счетчика:

 дубль a (0,3), b (2,5);
для (двойной x = 0,0; x <= 2,0; x + = 0,25)
  cout << "\ n \ tx =" << x << "\ ta * x + b =" << a * x + b;

Этот фрагмент кода вычисляет значение a * x + b для значений x от 0,0 до 2,0 , с шагом 0,25 ; однако вам нужно позаботиться при использовании счетчика с плавающей запятой в петля. Многие десятичные значения не могут быть представлены точно в двоичном формате форма с плавающей запятой, поэтому расхождения может накапливаться за счет совокупных значений. Это означает, что вам не следует кодировать для цикла, так что завершение цикла зависит от цикла с плавающей запятой счетчик достигает точного значения. Для Например, следующий плохо спроектированный цикл никогда не заканчивается:

 for (double x = 0.0; x! = 1.0; x + = 0.2)
  cout << x;
 

Целью этого цикла является вывести значение x по мере его изменения от 0,0 до 1,0 ; однако 0,2 не имеет точного представления как двоичное значение с плавающей запятой, поэтому значение x никогда не бывает точно 1 . Таким образом, второй контур управления выражение всегда ложно, и цикл продолжается бесконечно.

Кто-нибудь может объяснить, как первый блок кода работает, а второй - нет?

45
задан mskfisher 9 May 2012 в 16:14
поделиться