Показать сообщение отдельно
  #7  
Старый 10.03.2011, 07:38
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Весьма часто простые дроби вроде 0.1 или 0.7 не могут конвертироваться в их внутренние двоичные представления без потери точности. Это может привести к парадоксальным результатам: например, floor((0.1+0.7)*10) обычно возвращает 7 вместо ожидаемого 8 как результат внутреннего представления приблизительного числа 7.9999999999....

Причиной является то, что невозможно точно выразить некоторые дроби в десятичной нотации конечным количеством цифр. Например, 1/3 в десятичной форме имеет вид 0.3333333...
Кстати, если взять тип Extended а не Double или Real, то точность сильно возрастает... вернее для данной задачи погрешности не наблюдается
Код:
var
  i:integer;
  x:Extended;
  a:array of Extended;
begin
  setlength(a, 10001);
  x:=0;
  for i:=0 to 10000 do
    begin
    a[i]:=x;
    x:=x+0.01;
    end;
end;
Для понимания вопроса стоит почитать о форме представления числа с плавающей точкой/запятой .
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием