NaNの表現
NaN (Not a Number)とは、プログラミングにおける特殊な浮動小数点値
未定義または表現不可能な数学演算の結果を表し、例えば以下のパターン。
0/0を計算する
負の数の平方根
NaNには2種類ある
quiet NaN
割り込みや例外を発生させることなく、ほとんどの算術演算でNaNのまま伝搬していく
多くのプログラミング言語やライブラリで採用されているのはこっち
signaling NaN
NaNが発生すると例外が発生する
IEEE754浮動小数点規格では、NaN(quietとsignalingの両方)は特定のビットパターンを使って表現される。
倍精度浮動小数点数(64bit)を扱う場合、指数部はすべて1に設定され、分数部は非ゼロ。
quiet NaNの場合、最上位の分数ビットは1
つまり
符号bitは0(正のNaN)
指数部は全て1 (ここがNaNである条件)
最上位の分数bitが
1 だと quiet NaN
0だと signaling NaN
残りの分数bitは無関係(0でも1でもどちらでも良い)
よってNaN(倍精度)は
code:nan-float.c
0 (符号部)
11111111111 (指数部11bit)
1100000000000000000000000000000000000000000000000000 (仮数部52bit)
0x7ffc000000000000 => 0111111111111100000000000000000000000000000000000000000000000000 (binary)
仮数部が全て0だと infinity,(∞)か?
参考:
NaN - Wikipedia
浮動小数点数内部表現シミュレーター - instant tools
Float Exposed
https://ciechanow.ski/exposing-floating-point/
関連
Dynamic Typing and NaN Boxing
言語実装するときに動的型付けの変数を NaN Boxing というNaNを利用する方法で表現できる
wren-langはNaN Boxingを利用している
Another NaN-based tagging strategy for dynamic programming languages
Crafting Interpreters
Types of Values · Crafting Interpreters