はじめMath! Javaでコンピュータ数学

第9回 実数型のしくみ[後編]

この記事を読むのに必要な時間:およそ 4 分

4. (2e3)Dをfloat型の16進数に変換する。

(1)正数なので符号部は0。

(2)絶対値は(2e3)D。これは(2)D*(1000)Dのこと。符号なし2進数に変換すると(10.)B*(11 1110 1000)B。

これを計算する。


  1111101000
*)        10      2進数の乗算。
------------
           0
 1111101000
------------
 11111010000

(3)最も左の1の次に小数点を移動する。(1.1111010000)Bとなる。
小数点の移動は左へ10桁。

(4)仮数部は小数点以下23ビット分。ビット数の足りない部分は0でうめる。

  (1111 0100 0000 0000 0000 000)B

(5)指数部は,小数点の移動が左へ10桁だったため+10+127 = 137。137を2進数に変換すると,(1000 1001)B となる。

(6)以上より求める値は


(0 1000 1001 1111 0100 0000 0000 0000 000)B
 ^ ~~~~~~~~~ ****************************
 S     E                    M

これを16進数に変換する。変換のため,左から4桁ごとに空白を入れ直す。


(0100 0100 1111 1010 0000 0000 0000 0000)B

(0x 4    4    f    a    0    0    0    0)H

以上のことから,(2e3)Dはfloat型の16進数に変換すると(0x44fa 0000)Hとなる。

5. (2.7182)Dをfloat型の16進数に変換する。

(1)正数なので符号部は0。

(2)絶対値は(2.7182)D。符号なし2進数に変換すると

  (10.1011 0111 1101 1011 1111 010)B。

小数部分の計算は終了することなく続くのだが,整数部分が2ビットあるので,小数部分はあと22ビット分計算すればよいという見立てができる。

(3)最も左の1の次に小数点を移動する。(1.0101 1011 1110 1101 1111 1010)Bとなる。
小数点の移動は左へ1桁。

(4)仮数部は小数点以下23ビット分。無限小数が続くが23ビット目で打ち切る(!打ち切りにより誤差が発生しました!このことを覚えておいてください)。

  (0101 1011 1110 1101 1111 101)B

(5)指数部は,小数点の移動が左へ1桁だったため+1+127 = 128。128を2進数に変換すると,(1000 0000)Bとなる。

(6)以上より求める値は


(0 1000 0000 0101 1011 1110 1101 1111 101)B
 ^ ~~~~~~~~~ ****************************
 S     E                   M

これを16進数に変換する。変換のため,左から4桁ごとに空白を入れ直す。


(0100 0000 0010 1101 1111 0110 1111 1101)B
(0x 4    0    2    d    f    6    f    d)H

以上のことから,(2.7182)Dはfloat型の16進数に変換すると(0x402d f6fd)Hとなる。

それでは,数値をプログラムに入力し確認してみましょう。

リスト7.1 ShowHexCode2.java の実行結果

10 進実数値を入力して下さい。> 2
[int](0x2)H
[long](0x2)H
[float](0x40000000)H
[double](0x4000000000000000)H
10 進実数値を入力して下さい。> 2.625
[int](0x2)H
[long](0x2)H
[float](0x40280000)H
[double](0x4005000000000000)H
10 進実数値を入力して下さい。> 1000
[int](0x3e8)H
[long](0x3e8)H
[float](0x447a0000)H
[double](0x408f400000000000)H
10 進実数値を入力して下さい。> 2e3
[int](0x7d0)H
[long](0x7d0)H
[float](0x44fa0000)H
[double](0x409f400000000000)H
10 進実数値を入力して下さい。> 2.7128
[int](0x2)H
[long](0x2)H
[float](0x402d9e84)H
[double](0x4005b3d07c84b5dd)H

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。