(Untitled)

Nov 09, 2014 15:08

Чтобы закрыть тему foat-ов, разовью еще немного 0.9(9) = 1 и фобию по поводу "аааа страшная потеря точности" в виде 0.9999999998765 ( Read more... )

it/tech

Leave a comment

Comments 32

wizzard0 November 9 2014, 12:16:55 UTC
Оо, по ссылке есть статья 96 года с клевым округлятором, спасибо.

Reply

dmih November 9 2014, 12:22:31 UTC
"Printing Floating-Point Numbers Quickly and Accurately" офигительная, да!

Reply

dmih November 9 2014, 12:23:06 UTC
Хотя для начала и без матана программистам хорошо бы просто запомнить, что нельзя смотреть на float-ы глазами, как я в прошлом посте написал.

Reply


buddy_ekb November 9 2014, 13:20:23 UTC
как-то с годами начинаешь без особого содрогания смотреть на такие вот косяки (ой, а он не знает из чего float собран, и вообще * шарашит в много-JOIN-овые SELECT'ы, "ну а чо, работает же!").

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

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

по теме - ну явно же неразумно использовать в биллинге ни длинные, ни короткие decimal, ни float'ы всех мастей.
использовать надо GNU MP и его аналоги, но это вообще отдельный холивар, да ещё и связанный с хранением промежуточных значений во внешних хранилищах (привет, SQL).

Reply

dmih November 9 2014, 13:27:27 UTC
Мы сейчас так договоримся до того, что программисту не надо знать, как int устроен.

Reply

buddy_ekb November 9 2014, 13:35:33 UTC
ха. применительно к биллингу - именно, что не нужно программисту знать как устроены int и long на его любимой платформе и ему бы лучше знать ПБУ.

Reply

dmih November 9 2014, 13:55:39 UTC
Я наверное частично соглашусь в том смсысле, что незнание ПБУ приводит к еще более странным биллингам, чем незнание программирования :)

Reply


spiculator November 9 2014, 14:28:24 UTC
Надо в rational хранить, тогда вообще на всё можно положить. Никаких действий, кроме отнять-сложить-умножить-разделить, в биллинге в принципе быть не может. Хотя при сложении дробей с разными делителями результат может получиться некрасивый, на этот случай применяем вместо int'а бескончный int, как там он называется. :)

Reply

spiculator November 9 2014, 14:30:27 UTC
Жалко, что акт нельзя выставить на 14+3/31 р.

Reply

dmih November 9 2014, 14:34:52 UTC
1/31 с 1/30 и 1/28 и 1/29 очень уж некрасиво складывается.
Сразу наступит такой ад, что неясно, в чем недостаток хранить просто сразу с эпсилон-точностью, где эпсилон доказанно устраивает :)

Reply

spiculator November 9 2014, 14:41:10 UTC
Всего-то четыре разных делителя, наименьшее общее кратное -- четыреста тысяч, в long влезет. :)

Reply


dmarck November 9 2014, 16:52:19 UTC
Эмм, я тупой тормоз или почему никто на numeric не ссылается?

Reply

dmih November 9 2014, 16:56:27 UTC
Есть соседний пост, где тема раскрыта лучше - http://amarao-san.livejournal.com/2944300.html

Reply

dmarck November 9 2014, 17:00:00 UTC
Да я вроде бы все три прочитал, и продолжаю недоумённо крутить носом ;)

Reply

dmih November 9 2014, 17:02:22 UTC
Да нет разницы между numeric/decimal(фикс точка, основание 10) и float(плав.точка, основание 2).
Либо мы храним дроби, либо нет.
Если храним, реализация в любом случае замысловатая и примерно одинаковая для всех методов.
Если нет, реализация простая, но тогда получается не биллинг, а простите говно.

Reply


schors November 9 2014, 19:20:21 UTC
Я видимо туповат, но я так и не понял, чего ты до моих костылей с подневной тарификацией докопался.

P.S. Всё перечитал - всё равно не понял

Reply

dmih November 9 2014, 19:53:38 UTC
Из эстетических соображений.
Вообще я так понимаю у тебя это вспомогательная система всё-таки, с таким можно жить, это легкая шиза.

Reply


Leave a comment

Up