はい、これらの演算がEXACTである限り、構造を浮動小数点演算に分解でき、最終的な不正確な演算を 1 つ実行できます。
残念ながら、浮動小数点演算はすぐに不正確になります。仮数の精度を超えると、結果が丸められます。丸めの「エラー」が導入されると、それはその後の操作で累積されます...
したがって、一般的にいいえ、そのような単純なアルゴリズムを使用して任意の小数を変換することはできません。他の人がすでにあなたに言ったように、正しいもののulp。
しかし、どこまで行けるか見てみましょう:
次のようにフロートを慎重に再構築すると:
if(biasedExponent >= 0)
return integerMantissa * (10^biasedExponent);
else
return integerMantissa / (10^(-biasedExponent));
桁数が多い場合に integerMantissa を累積するときと、10 を biasedExponent で累乗するときの両方で、精度を超えるリスクがあります...
幸いなことに、最初の 2 つの演算が正確であれば、最後の不正確な演算 * または / を許容できます。IEEE プロパティのおかげで、結果は正しく丸められます。
これを、精度が 24 ビットの単精度浮動小数点数に適用してみましょう。
10^8 > 2^24 > 10^7
2 の倍数は指数を増やすだけで、仮数は変更しないことに注意してください。
5^11 > 2^24 > 5^10
ただし、integerMantissa で 7 桁の精度と、-10 から 10 の間の biasedExponent を使用できます。
倍精度で53ビット、
10^16 > 2^53 > 10^15
5^23 > 2^53 > 5^22
したがって、15 桁の 10 進数と、-22 から 22 の間の偏った指数を使用できます。
数字が常に正しい範囲に収まるかどうかは、あなた次第です...(本当に難しい場合は、末尾のゼロを挿入/削除することで、仮数と指数のバランスをとることができます)。
それ以外の場合は、拡張精度を使用する必要があります。あなたの言語が任意精度の整数を提供する場合、それを正しく理解するのは少し難しいですが、それほど
難しくはありません。-optimizing.htmlおよびhttp://smallissimo.blogspot.fr/2011/09/reviewing-fraction-asfloat.html
これらは単純で単純な実装であることに注意してください。幸いなことに、libc はより最適化されています。