Да , вы можете разбить конструкцию на операции с плавающей запятой , пока эти операции ТОЧНЫЕ , и вы можете позволить себе один финал неточная операция.
К сожалению, операции с плавающей точкой вскоре становятся неточными, когда вы превышаете точность мантиссы, результаты округляются. Как только будет введена «ошибка» округления, она будет накапливаться в дальнейших операциях ...
Поэтому, как правило, NO , вы не можете использовать такой наивный алгоритм для преобразования произвольных десятичных дробей, это может привести к неправильному округлению числа, от нескольких правильных значений, как уже говорили вам другие.
НО ПОСМОТРИМ, КАК ДАЛЬШЕ МЫ МОЖЕМ ПОЙТИ:
Если вы тщательно восстановите поплавок так:
if(biasedExponent >= 0)
return integerMantissa * (10^biasedExponent);
else
return integerMantissa / (10^(-biasedExponent));
существует риск превышения точности как при кумуляции integerMantissa, если она имеет много цифр, так и при увеличении 10 до степени biasedExponent ...
К счастью, если первые две операции являются точными, то вы можете позволить себе окончательную неточную операцию * или /, благодаря свойствам IEEE, результат будет округлен правильно.
Давайте применим это к плавающим элементам одинарной точности, которые имеют точность 24 бита.
10^8 > 2^24 > 10^7
Отмечая, что кратное 2 только увеличит показатель степени и оставит мантиссу без изменений, нам нужно иметь дело только со степенями 5 для возведения в степень 10:
5^11 > 2^24 > 5^10
Тем не менее, вы можете позволить себе 7 цифр точности в целочисленной Мантиссе и смещенном экспоненте между -10 и 10.
с двойной точностью, 53 бита,
10^16 > 2^53 > 10^15
5^23 > 2^53 > 5^22
Таким образом, вы можете позволить себе 15 десятичных цифр и смещение в диапазоне от -22 до 22.
Вам решать, будут ли ваши числа всегда попадать в правильный диапазон ... (Если вы действительно хитры, вы можете организовать баланс мантиссы и экспоненты, вставляя / удаляя конечные нули).
В противном случае вам придется использовать некоторую расширенную точность.
Если ваш язык предоставляет произвольные целочисленные значения точности, то сделать это правильно, но не так сложно, я сделал это в Smalltalk и написал об этом в http://smallissimo.blogspot.fr/2011/09/clarifying-and-optimizing.html и http://smallissimo.blogspot.fr/2011/09/reviewing-fraction-asfloat.html
Обратите внимание, что это простые и наивные реализации. К счастью, libc более оптимизирован.