СЯУ python -c "print 0.1+0.2"
Чорт, даже и PHP тоже! ‎- новомодная имитация мышления
А, впрочем это просто оптимизация output, результат print(0.1+0.2 == 0.3) немного предсказуем. ‎- новомодная имитация мышления
в смысле __repr__ поправили, чтобы люди не охуевали от ieee 754? ruby -e "puts 0.1 + 0.2 => 0.30000000000000004; ruby -e "puts 0.1 + 0.3" => 0.4 ‎- адский хардлайн в засаде
^^ ага, это относительно недавние изменения. ‎- адский хардлайн в засаде
да, я чо-то уже начал завидовать/удивляться, что они поступились Эффективностью Математики ради Предсказуемости Результата. ‎- новомодная имитация мышления
интересно, про какой язык из новомодных я вроде бы читал, что там так и сделали?.. ‎- новомодная имитация мышления
^ я вот сходу не припомню, может @9000 знает? вообще странно, что нет/мало языков, где decimal по дефолту через литералы задаётся, а для float отдельная конструкция. ‎- адский хардлайн в засаде
кажется Wolfram (что было бы логично), но сходу в доках не нашёл, а ноутбуки на вёбе они как-то странным образом поломали. ‎- новомодная имитация мышления
Да, просто оптимизация вывода. Всё ж 0.1 — это явно floating point notation; логично было бы получать рациональные числа через какую-то другую операцию, типа 1//10 там, как в Julia. Или в clojure вроде / тоже возвращает rational, и надо руками приводить к float / double. Кстати, в том же питоне поддержка рациональных чисел есть из коробки (import fractions). ‎- 9000
↑ в рубе тоже (require 'rational') :) ‎- новомодная имитация мышления
Ну да. Сделать-то нетрудно и понятно, когда надо. Но обычно не особо надо, а float быстрее и внятнее в широком диапазоне. Главное, для денег float не использовать. ‎- 9000
так-то да. просто для ньюбов это реальное фуууу. ну и для тестов, скажем :) ‎- новомодная имитация мышления
ну, это, писать большими буквами во всяком вводном курсе? поди, все, кто математику доучил до 6-7 класса, в курсе про ошибки округления. ‎- 9000
^^ ну вот в руби, мне кажется, люди чаще с деньгами работают, чем с чем-то где float нужны. интересно, почему по дефолту не сделали поведение "человеческое" — (0.1 + 0.1 == 0.2) типа. ‎- адский хардлайн в засаде
т.е. по умолчанию надо было бы 1.2 разбирать как 12/10 (aka 6/5) и представлять как рациональное? а при выводе что делать? вот написали мы print 1/3, что выводить? а кому floating point нужен, пусть везде пишут (1/2).asFloat или как-то так? this is a whole another kettle of fish™. ‎- 9000
я про децимал скорее, про rational и дробное представление я не говорил и не думаю, что так люди в жизни часто считают. я думаю, что в рубях (не в любом языке) было бы удобнее >>> decimal.Decimal('0.4') + decimal.Decimal('0.6') => Decimal('1.0') -- без необходимости оборачивать. ‎- адский хардлайн в засаде
ну есть какое-то, мне кажется, «по-человечески понятное» поведение: то есть что там внутри — не важно, но expect(0.1+0.1).to eq 0.2 и т.д. а ЕСЛИ вам нужна эффективная математика, то вы используете Специальные Классы Для Эффективной Математики. мне кажется, что для современного, не полностью математически-ориентированного языка это логичнее. ‎- новомодная имитация мышления
кому нужен флоат пишут не 1.2, а 1.2f например, или float('1.2'). короче я про своп float с decimal местами на поле "дефолт" и "опция". ‎- адский хардлайн в засаде
Тогда decimal с переменным (неограниченным) числом знаков и плавающей точкой, так, чтобы 0.1 / 2 == 0.05. Прямо как на мейнфреймах 50 лет назад. ‎- 9000
^ и в оракле современном ‎- urquan
http://www.slideshare.net/mrkn/float-is-legacy воооооот. вроде как для 2.4 рассматривают. ‎- новомодная имитация мышления