![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Округление
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. Откуда то "мусор" в конце. Как его убрать?