О реализации точного представления чисел или «где хранить деньги?»
От: SergH Россия  
Дата: 27.02.13 00:20
Оценка:
Привет,

О реализации точного представления чисел или «где хранить деньги?»
Автор(ы): Караваев Дмитрий Юрьевич
Дата: 26.02.2013
Статья посвящена описанию реализации в трансляторе вычислений без округлений для значений, представленных десятичными дробями.

Автор Дмитрий Караваев

Статья так себе. Даже если не касаться того, что язык ПЛ/1 сейчас мало кому интересен.

— в двоично-десятичном формате нет ничего волшебного.
--- реализовать сложение с бесконечной точностью на IA-32 можно и со стандартными числами, для этого там есть флаг переноса. И будет гораздо быстрее, т.к. можно будет складывать не побайтно, а словами. Стандартное умножение реализует произвольную точность всегда, т.к. на выходе у него два регистра.
--- для реализации числа с фиксированной точкой достаточно хранить значение в самых маленьких "копейках", которые мы хотим учитывать. Это будет целое число, ура, его можно хранить как обычно, без двоично-десятичных. В сущности, внутри ПЛ/1 именно это и делает, но хранит зачем-то в двоично-десятичных. Наверное есть какие-то резоны, но они не концептуальные, видимо так было почему-то удобнее.

— предложенная реализация, как и DECIMAL в C#, не свободна от округлений. Дмитрий сначала удивляется такой особенности DECIMAL, но потом признаёт, что и у него на 3 делить получается не очень. Ну зачем же тогда удивляться чужим недостаткам.

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

— раз уж деньги -- не сказано про правильные округления, там есть особенность с округлением последней 5
Делай что должно, и будь что будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.