Отправляет email-рассылки с помощью сервиса Sendsay

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
Почему?!

Ответить   Strong Wed, 31 Aug 2005 16:19:18 +0700 (#427472)

 

Ответы:

В сообщении от 31 августа 2005 13:19 Strong написал(a):

Потому что 0.5 в двоичной системе представляется в виде
конечной дроби, а 0.05 - нет и при вводе должно как-то
округляться. Вот и получается больше (или меньше - зависит
от реализации).

Но вообще закладываться на такие вещи - это нарываться на
проблемы. float и прочее вообще лучше без крайней
необходимости не использовать - это не единственный
сюрприз, который вас поджидает.

Ответить   "Sergey B. Khvatov" Wed, 31 Aug 2005 14:00:13 +0400 (#427494)

 

Спасибо за Ваши ответы! Но появились новые вопросы...

А что такое конечная/не- дробь?

А как же быть? И зачем нужен такой косячный тип?

Ответить   Strong Wed, 31 Aug 2005 23:04:22 +0700 (#427711)

 

В сообщении от 31 августа 2005 20:04 Strong написал(a):

Короче - 0.05 точно в типе float/double/long double на
двоичных машинах не представить, так же как не представить
1/3 в виде конечной десятичной дроби.

Помнить, что все результаты вычислений с плавающей точкой
неточные, и погрешность обычно больше, чем хочется.

Приходится мириться - лучшего типа всё равно нет.
Или использовать целые - с ними косяков меньше.

Ответить   "Sergey B. Khvatov" Thu, 1 Sep 2005 09:55:16 +0400 (#428032)

 

Да какая же это погрешность? - Это натуральное нарушение элементарных правил
математики, кроющееся в плохой технической реализации оного!

Мне кажется, нужно исправить косяк и всё - что делалось неоднократно. -
Просто если спотыкаться на элементарном, то как дальше-то считать?

Ну, а как вот этот пример реализовать? - Делить и после умножать?

Ответить   Strong Fri, 02 Sep 2005 00:49:24 +0700 (#428700)

 

Кажется, нужно прибавлять число на разряд меньше. К 0,5 нужно прибавить 0,01.
Помогает.

И вообще, ситуация вполне нормальная - как Вы сможете отличить два числа -
0,999999999(9) и 1, если разница между ними бесконечно мала(т.е. 0,"бесконечное
число нолей"1)? А каждый тип данных имеет ограниченную разрядность.

Ответить   Sat, 03 Sep 2005 10:55:15 +0300 (#429820)

 

Естественно, когда результат знаешь... А когда он лежит в пределе [0,1]?

Вопрос не в том, как я это сделаю - равносильно можно спросить специфику создания
процессоров Intel, - а то как это сделано, или почему до сих пор не сделано.
Проблема яйца, выеденого не стоит, странно, что её до сих пор не решили.
Хотелось бы знать как, В ОБЩЕМ случае ([0,1]), люди изворачиваются
здесь.

Ответить   Strong Sat, 03 Sep 2005 16:27:46 +0700 (#429884)

 

В сообщении от 1125754066 секунд после начала Эпохи Strong написал(а):

Может потому что ее нет? Или она не так страшна, как вы ее
представляете.

А в чем собственно проблема? Не хватает точности типа float? Дык,
используйте double. Не нравиться как работает округление? Ну, напишите
свою функцию round.

Ответить   Konstantin Korikov Sat, 3 Sep 2005 14:35:03 +0300 (#429962)

 

В сообщении от 3 сентября 2005 13:27 Strong написал(a):

В общем случае эта проблема неразрешима.

Существуют пакеты, представляющие рациональные числа в виде
дробей, но они используют целую числа неограниченной длины,
работают очень медленно и используются только от
безысходности.

Да и не слишком это нужно. Если поработать собственной
головой, в подавляющем большинстве случаев это можно
обойти.

Ответить   "Sergey B. Khvatov" Mon, 5 Sep 2005 10:45:03 +0400 (#430901)