![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Занимательные наблюдения над плавающей запятой
Anatoly Podgoretsky © (2005-06-04 13:36:00)
procedure TForm1.Button1Click(Sender: TObject);
var
A1:Single;
A2:Single;
b1:Double;
b2:Double;
c1:Extended;
c2:Extended;
i:Integer;
begin
A1:=0;
A2:=0.02;
B1:=0;
B2:=0.02;
c1:=0;
c2:=0.02;
Label13.Caption := FloatToStr(A2);
Label14.Caption := FormatFloat('0.0000000000000000000',a2);
Label15.Caption := FloatToStr(b2);
Label16.Caption := FormatFloat('0.0000000000000000000',b2);
Label17.Caption := FloatToStr(c2);
Label18.Caption := FormatFloat('0.0000000000000000000',c2);
Application.processmessages;
for i := 1 to 1000000000 do a1:=a1+a2;
Label1.Caption := FloatToStr(A1); //!!!
Label2.Caption := FormatFloat('0.000000000000',A1); //!!!
Label3.Caption := FloatToStr(A2*1000000000);
Label4.Caption := FormatFloat('0.0000000000',A2*1000000000);
Application.processmessages;
for i := 1 to 1000000000 do b1:=b1+b2;
Label5.Caption := FloatToStr(B1);
Label6.Caption := FormatFloat('0.000000000000',b1);
Label7.Caption := FloatToStr(b2*1000000000);
Label8.Caption := FormatFloat('0.0000000000',b2*1000000000);
Application.processmessages;
for i := 1 to 1000000000 do c1:=c1+c2;
Label9.Caption := FloatToStr(C1);
Label10.Caption := FormatFloat('0.000000000000',c1);
Label11.Caption := FloatToStr(c2*1000000000);
Label12.Caption := FormatFloat('0.0000000000',c2*1000000000);
Application.processmessages;
end;
IUnKnouwn (2005-06-04 22:16:00) [1]Прикольно :).
Вот и думай после этого как поведет себя какая нить переменная, намечается вопрос о правильность работы самой дельфи
Anatoly Podgoretsky (2005-06-04 22:00:00) [2]Строки помечены !!! - но это так побочный эффект, цель былп продемонстрировать ошибки расчетов с плавающей запятой.
Anatoly Podgoretsky (2005-06-04 21:59:00) [3]Ну все за исключением Sun(Single) равны примерно 20 000 000, а эта примерно 500 000.
KilkennyCat (2005-06-04 21:10:00) [4]
> [5] Defunct © (04.06.05 20:46)
с 12-ю, как же... :)
Defunct (2005-06-04 20:46:00) [5]А можно результаты сразу привести, а то собирать программу с 12-ю лэйблами, честно говоря, и не в обиду будет сказано, - лениво. ;>
Anatoly Podgoretsky (2005-06-04 14:45:00) [6]Неприятная такая ошибка, аж в 40 раз :-)
Ну а остальное демонстирурует не эквивалентность операций, кроме того демонстрируется и проблема с 0,02 данное число невозможно точно представить, а тест для Extended как бы пока обратное. Это ошибка преобразования в символьное представление.
Ученик (2005-06-04 14:07:00) [7]>Anatoly Podgoretsky © (04.06.05 13:59) [2]
Поддержка Single, наверно, все-таки стратегическая ошибка :-)
Anatoly Podgoretsky (2005-06-04 13:59:00) [8]Ну какой может быть совет для плавающией запятой :-)
Только вот смущает ошибка для Single
Ученик (2005-06-04 13:58:00) [9]>Anatoly Podgoretsky © (04.06.05 13:36)
Какой будет совет ?