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

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

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

前回は,IEEE754のしくみについて詳しく学びました。今回はその確認として,実際に実数型にどのような形式で格納されているか表示させてみましょう。あわせて,筆算の結果と一致するかどうかも確認しましょう。

問題:適当な実数値をint型,long型,float型,double型に格納し,16進数形式で表示してみましょう。

(1)連載第7回の問題で作成したソースコードを変更して,実数型の数値を16進数形式で表示できるようにしてください。

ちょっと変更するだけで,実数型のデータも表示が可能になります。拍子抜けするぐらいに簡単です。こういう事もプログラミングの面白さです。

(2)次の数値をfloat型の16進数に筆算で変換してください。その後に,(1)で作成したプログラムを実行して確認してみましょう。double型の変換結果とも比較してください。

基数の変換方法については本連載第6回を参照して下さい。

  1. 2.0 (小手調べに)
  2. 2.625 (2.0のときの仮数部との違いに注目)
  3. 1000 (少し大きな数)
  4. 2 × 103 (プログラム実行時は2e3と入力してください)
  5. 2.7182 (ネイピア数)

(3)float型に格納されていた値を16進数で表記したものを,10進数に変換しましょう。計算には電卓を使用して結構です。それぞれの数値は,ある物理定数を表しています。該当する物理定数名を答えてください。

  1. (0x66ff0bbd)H
  2. (0x43889333)H

解説

(1)連載第7回の問題で作成したソースコードを変更して,実数型の数値を16進数形式で表示できるようにしてください。

ほんのわずかな変更で目的のソースコードになります。型変換(キャスト)をうまく利用したのです。拍子抜けしませんか?

リスト8.1 ShowHexCode2.java

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
//filename : ShowHexCode2.java
import java.io.*;
class ShowHexCode2 {
  public static void main(String[] args)
                          throws IOException {

    System.out.print("10進数値を入力して下さい。>");

    BufferedReader br = new BufferedReader(
                        new InputStreamReader(System.in)
                      );

    String inputtext = br.readLine();
    float numf = Float.parseFloat(inputtext);
    double numd = Double.parseDouble(inputtext);
    int num = (int) numd;
    long numl = (long) numd;

    System.out.println("[int](0x"
      + Integer.toHexString(num) + ")H");
    System.out.println("[long](0x"
      + Long.toHexString(numl) + ")H");
    System.out.println("[float](0x"
      + Integer.toHexString(Float.floatToIntBits(numf))
      + ")H ");
    System.out.println("[double](0x"
      + Long.toHexString(Double.doubleToRawLongBits(numd))
      + ")H");
  }// end of main
}// end of class

(2)次の数値をfloat型の16進数に筆算で変換してください。その後に,(1)で作成したプログラムを実行して確認してみましょう。double型の変換結果とも比較してください。

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

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

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

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

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

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

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


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

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


(0100 0000 0000 0000 0000 0000 0000 0000)B

(0x 4 0 0 0 0 0 0 0)H

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

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

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

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

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

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

  (0101 0000 0000 0000 0000 000)B

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

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


(0 1000 0000 0101 0000 0000 0000 0000 000)B
 ^ ~~~~~~~~~ ****************************
 S     E                   M

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


(0100 0000 0010 1000 0000 0000 0000 0000)B

(0x 4    0    2    8    0    0    0    0)H

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

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

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

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

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

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

  (1111 0100 0000 0000 0000 000)B

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

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


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

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


(0100 0100 0111 1010 0000 0000 0000 0000)B

(0x 4    4    7    a    0    0    0    0)H

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

著者プロフィール

平田敦(ひらたあつし)

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

コメント

コメントの記入