3.2.9. Вычитание в цикле

We use cookies. Read the Privacy and Cookie Policy

3.2.9. Вычитание в цикле

Рассмотрим еще один пример, иллюстрирующий ситуацию, которая часто озадачивает начинающего программиста (листинг 3.12, пример Subtraction на компакт-диске).

Листинг 3.12. Накапливание ошибки при вычитании

procedure TForm1.Button1Click(Sender: TObject);

var

 R: Single;

 I: Integer;

begin

 R:= 1;

 for I:= 1 to 10 do R:= R — 0.1;

 Label1.Caption:= FloatToStr(R);

end;

В результате выполнения этого кода на экране появится -7.3015691270939E-8 вместо ожидаемого нуля. Объяснение этому достаточно очевидно, если вспомнить то, о чем мы говорили ранее. Число 0,1 не может быть передано точно ни в одном из вещественных типов, а при каждом вычислении происходит преобразование Single в Extended и обратно, причем последнее — с потерей точности. Эти потери приводят к тому, что мы получаем в результате не ноль, а "почти ноль".

Данный текст является ознакомительным фрагментом.