私は浮動小数点演算をよりよく理解しようとしており、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」へのリンクをいくつか見ました。
0.1
数値がどのように浮動小数点数や0.5
小数として格納されるのか、まだわかりません。
誰かがそれがどのようにレイアウトされているかを説明してもらえますか?
float が 2 つの部分 (つまり、あるべき乗数) であることは知っています。
私は浮動小数点演算をよりよく理解しようとしており、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」へのリンクをいくつか見ました。
0.1
数値がどのように浮動小数点数や0.5
小数として格納されるのか、まだわかりません。
誰かがそれがどのようにレイアウトされているかを説明してもらえますか?
float が 2 つの部分 (つまり、あるべき乗数) であることは知っています。
私は常にHarald Schmidt の online converterと、素晴らしい写真が掲載されたWikipedia IEEE754-1985 の記事を人々に紹介してきました。
これら 2 つの特定の値については、次のようになります (0.1 の場合):
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n
0 01111011 10011001100110011001101
| || || || || || +- 8388608
| || || || || |+--- 2097152
| || || || || +---- 1048576
| || || || |+------- 131072
| || || || +-------- 65536
| || || |+----------- 8192
| || || +------------ 4096
| || |+--------------- 512
| || +---------------- 256
| |+------------------- 32
| +-------------------- 16
+----------------------- 2
符号は正です。これは非常に簡単です。
指数は64+32+16+8+2+1 = 123 - 127 bias = -4
であるため、乗数はまたはです。2-4
1/16
仮数は分厚いです。これは、1
(暗黙の基数) と (それぞれがから始まり、右に向かって増加する値を持つすべてのビット) で構成されます。1/(2n)
n
1
{1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}
これらをすべて足し合わせると、 になります1.60000002384185791015625
。
これに乗数を掛けると が得られます0.100000001490116119384765625
。これが、IEEE754 float として正確に表すことができないと彼らが言う理由であり、タイプの質問0.1
に答える人々に SO で非常に多くの機会を提供します"why doesn't 0.1 + 0.1 + 0.1 == 0.3?"
:-)
0.5 の例はかなり簡単です。次のように表されます。
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000
つまり、それは暗黙の基数 であり1
、その他の追加要素はありません (すべての仮数ビットはゼロです)。
符号は再び正です。指数は64+32+16+8+4+2 = 126 - 127 bias = -1
です。したがって、乗数はまたはです。2-1
1/2
0.5
したがって、最終値は、またはで1
乗算されます。出来上がり!0.5
0.5
10 進数で考えた方が簡単な場合があります。
数値 1.345 は、
1 + 3/10 + 4/100 + 5/1000
また:
-1 -2 -3
1 + 3*10 + 4*10 + 5*10
同様に、10 進数の IEEE754 表現0.8125
は次のとおりです。
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 10100000000000000000000
暗黙の基数が 1 の場合、これはバイナリと同等です。
01111110-01111111
1.101 * 2
また:
-1
(1 + 1/2 + 1/8) * 2 (no 1/4 since that bit is 0)
これは次のようになります。
(8/8 + 4/8 + 1/8) * 1/2
そして次のようになります。
13/8 * 1/2 = 0.8125
まず、ウィキペディアのエントリとIEEE グループを参照してください。
基本的に、符号、数値、指数があります。ソースの基数に目的の基数に存在しない因子がある場合、ある基数の数値を別の基数で有限表現することはできません。たとえば、1/3 は有限の 10 進数として表すことはできませんが、3 進数 (基数 3) の数値 (0.1) 3として表すのは簡単です。
したがって、0.5 は有限のバイナリ表現 (0.1) 2、つまり 2 -1を持ちますが、2 と 10 には係数 (5) が共通していないため、0.1 は繰り返し表現になります。