l_n_m’s diary

よわい電気系の日記(本当にただの日記)

IEEE754……?

IEEE754

みなさんご存知、浮動小数点の標準規格ですね。
0.1+0.2が0.300...004になることで有名。

研究室のイベントで本を読んでいたのですが、改めて整数や浮動小数点の表現を学びました。こういうのの規格を定めるのって考えること多くて大変そう。

指数と仮数

1.xxxxxx * 2^yyyy

この形で浮動小数を表します。
32bit : 1 : 8 : 11
64bit : 1 : 11: 52
順に、符号、指数、仮数を表します。ここで、指数の部分は下駄履き表現されています。0x0なら-127とか-1023とか。

なんで下駄履き表現?

ソートしやすくするためです。
符号を頭につけているのは0との大小をすぐに分かるようにするため。
指数が、例えば2の補数表現だと、符号なしで見たときに大きい数字のとき、実際にはとても小さい数字になっています。それだと指数の大きさでソートするのが面倒。
そこで、0b000 < 0b111 のようなことが常に成り立つように(ビットで見ると、2の補数表現では0b000より0b111の方が小さいですよね)しています。賢い。

境界値問題

CodeIQがYouTubeに出している、jsに関する広告。
0.1ずつ足していくと、0.1, 0.2, 0.30...04, 0.4, 0.5, 0.6, 0.7, 0.799...9, 0.89...9, 0.99...9となってしまいます。
ループをするときには気を付けないと。
しかし、jsの問題と言いながら実際はIEEE754に関する知識を問う問題ですね。
整数がどんな表し方をされているかは正直常識の範囲だと思いますが、浮動小数点は頭から抜けている人も多いのでは。
「1.xxx * 2^yyy」という文字列を見れば、あーそういえばそうだったな、っていう人も多そう。僕がそうでした。くぅ……

教訓

言われて分かる、はまだ二流。調べるまで完全に抜け落ちていたのは不覚……!
当たり前のことでもちゃんと胸を張って説明できるようにならなきゃ、ですね。