off top: perl.
Кто-нить может объяснить сие:
$ perl -e 'printf "%.0f",0.5'
0
$ perl -e 'printf "%.0f",0.6'
1
??
Хотя
$ perl -e 'printf "%.1f",0.05'
0.1
Почему?!
За последние 60 дней ни разу не выходила
Сайт листа:
http://www.linuxrsp.ru
Открыт:
25-07-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.linux.discuss-list@subscribe.ru
Адрес
модератора: comp.soft.linux.discuss-owner@subscribe.ru
Кто-нить может объяснить сие:
$ perl -e 'printf "%.0f",0.5'
0
$ perl -e 'printf "%.0f",0.6'
1
??
Хотя
$ perl -e 'printf "%.1f",0.05'
0.1
Почему?!
Спасибо за Ваши ответы! Но появились новые вопросы...
А что такое конечная/не- дробь?
А как же быть? И зачем нужен такой косячный тип?
В сообщении от 31 августа 2005 20:04 Strong написал(a):
Короче - 0.05 точно в типе float/double/long double на
двоичных машинах не представить, так же как не представить
1/3 в виде конечной десятичной дроби.
Помнить, что все результаты вычислений с плавающей точкой
неточные, и погрешность обычно больше, чем хочется.
Приходится мириться - лучшего типа всё равно нет.
Или использовать целые - с ними косяков меньше.
Да какая же это погрешность? - Это натуральное нарушение элементарных правил
математики, кроющееся в плохой технической реализации оного!
Мне кажется, нужно исправить косяк и всё - что делалось неоднократно. -
Просто если спотыкаться на элементарном, то как дальше-то считать?
Ну, а как вот этот пример реализовать? - Делить и после умножать?
Кажется, нужно прибавлять число на разряд меньше. К 0,5 нужно прибавить 0,01.
Помогает.
И вообще, ситуация вполне нормальная - как Вы сможете отличить два числа -
0,999999999(9) и 1, если разница между ними бесконечно мала(т.е. 0,"бесконечное
число нолей"1)? А каждый тип данных имеет ограниченную разрядность.
Естественно, когда результат знаешь... А когда он лежит в пределе [0,1]?
Вопрос не в том, как я это сделаю - равносильно можно спросить специфику создания
процессоров Intel, - а то как это сделано, или почему до сих пор не сделано.
Проблема яйца, выеденого не стоит, странно, что её до сих пор не решили.
Хотелось бы знать как, В ОБЩЕМ случае ([0,1]), люди изворачиваются
здесь.
В сообщении от 1125754066 секунд после начала Эпохи Strong написал(а):
Может потому что ее нет? Или она не так страшна, как вы ее
представляете.
А в чем собственно проблема? Не хватает точности типа float? Дык,
используйте double. Не нравиться как работает округление? Ну, напишите
свою функцию round.
В сообщении от 3 сентября 2005 13:27 Strong написал(a):
В общем случае эта проблема неразрешима.
Существуют пакеты, представляющие рациональные числа в виде
дробей, но они используют целую числа неограниченной длины,
работают очень медленно и используются только от
безысходности.
Да и не слишком это нужно. Если поработать собственной
головой, в подавляющем большинстве случаев это можно
обойти.
В сообщении от 31 августа 2005 13:19 Strong написал(a):
Потому что 0.5 в двоичной системе представляется в виде
конечной дроби, а 0.05 - нет и при вводе должно как-то
округляться. Вот и получается больше (или меньше - зависит
от реализации).
Но вообще закладываться на такие вещи - это нарываться на
проблемы. float и прочее вообще лучше без крайней
необходимости не использовать - это не единственный
сюрприз, который вас поджидает.