浮動小数点形式がどのように機能するかをかなりよく理解しているにもかかわらず、問題を解決できません。誰かが答えにたどり着くまでの手順を教えてもらえますか? 1/3 を完全に表すことができないのはなぜですか? また、1/3 に最も近い数になったことをどのようにして知ることができるでしょうか?
2 に答える
IEEE 754 のfloatの小数部分は、2 の負のべき乗の合計から作成されます。
たとえば、0.5 は 2 -1、0.75 は 2 -1 +2 -2などです。
あなたの仕事を助けるために、考慮してください
N ビットの 2 の負の累乗を合計すると 1/3 に近づく数は?
1/3 は無限であるため、有限数のビット (32) float 内で正確に 1/3 を持つことはできません。
質問を完了するには、1/3 に近い値に到達するためのかなり簡単なアルゴリズムを実装できます。
N = 23 // mantissa bits
T = 1/3 // target
p = 0.5 // first negative power of 2
r = 0.0 // resultat
do N times
if ( r + p <= T ) r = r + p // add power of 2 if result is not bigger than target
p = p / 2 // next power of 2
done
結果をバイナリで視覚化するには、pがrに追加されたときに「1」を出力し、そうでないときに「0」を出力できます。最後のビットを「1」にして、結果をターゲットに近づけることができます。
「どこまで近づけるか?」に答えるために 浮動小数点に関する質問では、仮数 (小数部分) を整数に変更すると便利なことがよくあります。これを行うには、通常の 32 ビット バイナリ IEEE 浮動小数点数の通常の浮動小数点形式から始めます。
- 符号 s (+ または - を表す 0 または 1)、指数 e、および「1」で始まる分数 f。小数点以下23ビットです。これら 3 つの部分を組み合わせて、数 (–1) s •2 e •f を表します。
次に、分数 f が代わりに整数 F になるようにフォーマットをスケーリングします。これを行うには、指数から 23 を引き、分数 f に 2 23を掛けます。次に、次の形式があります。
- 符号 s、指数 e–23、および 2 23 •fに等しい整数 F (したがって 2 23 ≤ F < 2 24 )。これらの部分を組み合わせて、数 (–1) s •2 e–23 •F = (–1) s •2 e •f を表します。
ここで、通常の形式で 1/3 が持つべき指数を計算します。f を「1.」で開始するには、e を -2 にする必要があります。これは、1/3 = 2 –2 •4/3 であり、1 ≤ 4/3 < 2 なので、2 進数では 4/3 は「1.」で始まります。
次に、スケーリングされた形式を検討します。符号 s は 0、指数は –2–23 = –25、F は (–1) 0 •2 –25 •F ≈ 1/3 となる整数です。
これは簡単に解くことができます。F ≈ 2 25 •1/3 = 33554432/3 = 11184810.666…. この値に最も近い整数は 11184811 であるため、F = 11184811 です。
ここで、F の誤差が 1/3 (F がなければならない整数と希望する値との差) であり、その誤差が 2 -25でスケーリングされるため、誤差は 2 -25であることがわかります。 /3 ≒ 9.934e-09。値自体は 2 –25 •11184811 で、約 .3333333433 です。
(ここでは通常の数値のみを扱っていることに注意してください。浮動小数点形式の限界に近い数値については、オーバーフローとアンダーフローも考慮する必要があります。)