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

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

Округление


Dmk ©   (2016-02-12 00:57:00) 

Есть такое значение 504,00001502037. При сравнении с числом 504 они не равны, но по логике должны быть раны. Как бороться с мусором в конце? Поделитесь опытом.


Юрий Зотов   (2016-02-12 19:22:00) [1]

> Dmk ©   (12.02.16 16:23) [6]
> В том и прикол, что "мусор" появляется после округления!


Число 0.33 в двоичном коде не может быть представлено точно. Поэтому как ни округляй, а погрешность все равно будет.


Dimka Maslov   (2016-02-12 17:39:00) [2]

Даже RoundTo не избавляет от мусора. Просто после RoundTo можно брать гораздо меньшее eps при сравнении.


sniknik   (2016-02-12 17:10:00) [3]

> От чего это зависит?
от сопроцессора, и способа хранения таких чисел.


Германн   (2016-02-12 16:31:00) [4]


> Dmk ©   (12.02.16 16:23) [6]

Так ты статью по ссылке прочитал? Там все написано.


Dmk   (2016-02-12 16:23:00) [5]

>sniknik ©   (12.02.16 07:29) [3]
В том и прикол, что "мусор" появляется после округления!!! Причем не всегда!
От чего это зависит?


Rouse_   (2016-02-12 11:59:00) [6]


> Откуда то "мусор" в конце. Как его убрать?

http://rouse.drkb.ru/other.php#round


Dimka Maslov   (2016-02-12 08:26:00) [7]

Раньше были такие хорошие книжки, которые описывали принципы работы с вещественными числами и объясняли про мусор, возникающий из-за недостаточной точности вычислений и округления. А как с этим бороться нам ещё 20 лет назад в паровозной школе рассказывали. Преподаватели не знали, как правильно пишутся Turbo Paskal и Norton Comandor, но прекрасно вызубрили, что операция сравнения вещественных чисел должна записываться как abs(a-b)<eps, где eps - наперёд заданная точность.


sniknik   (2016-02-12 07:29:00) [8]

http://delphikingdom.com/asp/viewitem.asp?catalogid=374
Пример второй – сравнение


KilkennyCat   (2016-02-12 02:35:00) [9]

уменьшить разрядность до 2 после запятой. или округлять до 15


Dmk   (2016-02-12 01:02:00) [10]

>раны = равны

Все числа Extended.

Или вот еще пример: (100/300) без округления равно 0.333333333333485, а после RoundTo(100/300, -2) получается 0,330000013113022. Откуда то "мусор" в конце. Как его убрать?


Наверх

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