Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Занимательные наблюдения над плавающей запятой


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)  
Какой будет совет ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо