ときどきの雑記帖 RE* (新南口)
dtoa 解読 (2)
dtoa に何種類か値を与えた場合の変数の値を並べてみた。
input | be | bbits | xxxx | k | b(1) | b(2) | S | mhi | mlo |
---|---|---|---|---|---|---|---|---|---|
1250 | 1 | 10 | -1 | 3 | 00000271 | ||||
125 | 0 | 7 | 0 | 2 | 0000007d | ||||
12.5 | -1 | 5 | 1 | 1 | 00000019 | 0c800000:00000000 | 0a000000:00000000 | 00000040 | 00000040 |
1.25 | -2 | 3 | 2 | 0 | 00000005 | 0a000000:00000000 | 08000000:00000000 | 00000040 | 00000040 |
0.125 | -3 | 1 | 3 | -1 | 00000001 | 0a000000:00000000 | 08000000:00000000 | 00000050 | 00000028 |
0.1 | -55 | 52 | 55 | -1 | 000ccccc:cccccccd | 08000000:00000020 | 08000000:00000000 | 00000028 | 00000028 |
0.125 でmhi と mlo が異なっているのはこの数値が special_case (オンになっているビットが一つだけ) だからで、 125、1250といった整数は今回追いかけているアルゴリズムを適用するところまで行っていないので S、mhi、mlo は使われず空欄と。
もうちょっと詳しく。
input=1250
be=1, bbits=10
2337: b=00000271
2391: xxxx=-1
入力が1250の場合。ここでのbの値 271(16)は 二進数では 1000010111で、十進数にすると 535。 1250じゃあないじゃんとなるけど、ここで be の値 (今回は1)だけ左シフトしてやると 535 × 2 で めでたく1250になる。
input=125
be=0, bbits=7
2337: b=0000007d
2391: xxxx=0
入力が125の場合。 7d(16) は 125(10) でそのまま。 be も0。
7d(16) = 1111101(2)
で長さは7、bbitsも同じ。
input=12.5
be=-1, bbits=5
2337: b=00000019
2391: xxxx=1
入力が12.5の場合。 これをそのまま二進表記すると 1100.1 となるが 小数点がない整数のように変換する体なので、 19(16) (11011(2))となる。 そしてシフト量が-1(右方向へ1ビットシフト)。
input=1.25
be=-2, bbits=3
2337: b=00000005
2391: xxxx=2
入力が1.25の場合。 これをそのまま二進表記すると 1.01 となるが 小数点がない整数のように変換する体なので、 5(16) (101(2))となる。 そしてシフト量が-2(右方向へ2ビットシフト)。
input=0.125
be=-3, bbits=1
2337: b=00000001
2391: xxxx=3
入力が0.125の場合。 これをそのまま二進表記すると 0.001 となるが 小数点がない整数のように変換する体なので、 1(16) (1(2))となる。 そしてシフト量が-3(右方向へ3ビットシフト)。
≪ prev dtoa 解読(1)
next ≫ gawk 5.1