hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
HSPのdouble型は64bitの倍長精度浮動小数点です。一般的な倍長精度浮動小数点のビット構造はつぎのようになっている。
double(64bits) | |||
---|---|---|---|
部分名称 | 符号部 | 指数部 | 仮数部 |
ビット列 | 1ビット | 11ビット | 52ビット |
指数部は正と負の両方を扱えるようにするために1023を足す(ゲタ)。
仮数部の整数部は1以上2未満の値になるようにする。(正規化)。
仮数部は-1して0未満とする。(正規化では1〜2未満?)
とりあえず浮動小数点のビット列表示を作りました。 計算で求める方法は自分には分からないのでメモリをそのまま参照してます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
まず2.5を仮数部と指数部で表現すると
10.1 = 10.1 * 10@@@0@@@ (2進) |
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
10.1 * 10@@@0@@@ = 1.01 * 10@@@1@@@ (2進) |
仮数部が0未満ではないが-1するので
0.01 * 10@@@1@@@(2進) |
指数部には1023を足すので
0.01 * 10@@@100 0000 0000@@@(2進) |
よって
値 | ビット列 | |
---|---|---|
符号部 | 0 | 0 |
指数部 | 1024 | 1000000 0000 |
仮数部 | 1.25 | (0.)0100 00000000 00000000 00000000 00000000 00000000 00000000 |
全体 | 2.5 | 0100000 00000100 00000000 00000000 00000000 00000000 00000000 00000000 |
まず2.55を仮数部と指数部で表現すると
2.55 = 2.55 * 2@@@0@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
2.55 * 2@@@0@@@ = 1.275 * 2@@@1@@@
|
仮数部が0未満ではないが-1するので
0.275 * 2@@@1@@@
|
指数部には1023を足すので
0.275 * 2@@@1024@@@
|
つぎに仮数部を求める。
0.275 < 0.5(2@@@-1@@@) ・・・ NG 0.275 - 0.25(2@@@-2@@@) = 0.025 0.0000001430511474609375 - 0.00000002384185791015625 - 0.00000000894069671630859375 - 0.000000001490116119384765625 - 0.000000000558793544769287109375 - 0.0000000000931322574615478515625 - 0.0000000000349245965480804443359375 - 0.00000000000582076609134674072265625 - 0.00000000000218278728425502777099609375 - 0.000000000000363797880709171295166015625 - 0.000000000000136424205265939235687255859375 - 0.0000000000000227373675443232059478759765625 - 0.0000000000000085265128291212022304534912109375 - 0.00000000000000142108547152010037174224853515625 - 0.00000000000000053290705181997513940334320068359375 - 0.0000000000000002220446049250313080847263336181643125(2@@@-52@@@) |
仮数部は52ビットなのでこれ以上演算はできないので打ち切る。
以上により
値 | ビット列 | |
---|---|---|
符号部 | 0 | 0 |
指数部 | 1024 | 1000000 0000 |
仮数部 | 1.275 | (0.)0100 01100110 01100110 01100110 01100110 01100110 01100110 |
全体 | 2.55 | 0100000 00000100 01100110 01100110 01100110 01100110 01100110 01100110 |
まず255.000000を仮数部と指数部で表現すると
255.000000 = 255.000000 * 2@@@0@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
255.000000 * 2@@@0@@@ = 127.5 * 2@@@1@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
127.5 * 2@@@1@@@ = 63.75 * 2@@@2@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
63.75 * 2@@@2@@@ = 31.875 * 2@@@3@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
31.875 * 2@@@3@@@ = 15.9375 * 2@@@4@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
15.9375 * 2@@@4@@@ = 7.96875 * 2@@@5@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
7.96875 * 2@@@5@@@ = 3.984375 * 2@@@6@@@
|
仮数部が1〜2未満ではないので仮数部を右に1ビットシフトさせて正規化する。
3.984375 * 2@@@6@@@ = 1.9921875 * 2@@@7@@@
|
仮数部が0未満ではないが-1するので
0.9921875 * 2@@@7@@@
|
指数部には1023を足すので
0.9921875 * 2@@@1030@@@
|
次に仮数部を求める。(爆;;
1 2 3 4 5 6 7 8 9 |
|
HSP3.0
float 型の値(単精度実数値、32bit)(のメモリイメージ)と double 型の値(倍精度実数値、64bit)の相互変換を可能にします。 -- naznyark?