前回は、IEEE754のしくみについて詳しく学びました。今回はその確認として、実際に実数型にどのような形式で格納されているか表示させてみましょう。あわせて、筆算の結果と一致するかどうかも確認しましょう。
問題:適当な実数値をint型、long型、float型、double型に格納し、16進数形式で表示してみましょう。
(1)連載第7回の問題で作成したソースコードを変更して、実数型の数値を16進数形式で表示できるようにしてください。
ちょっと変更するだけで、実数型のデータも表示が可能になります。拍子抜けするぐらいに簡単です。こういう事もプログラミングの面白さです。
(2)次の数値をfloat型の16進数に筆算で変換してください。その後に、(1)で作成したプログラムを実行して確認してみましょう。double型の変換結果とも比較してください。
基数の変換方法については本連載第6回を参照して下さい。
- 2.0 (小手調べに)
- 2.625 (2.0のときの仮数部との違いに注目)
- 1000 (少し大きな数)
- 2 × 103 (プログラム実行時は2e3と入力してください)
- 2.7182 (ネイピア数)
(3)float型に格納されていた値を16進数で表記したものを、10進数に変換しましょう。計算には電卓を使用して結構です。それぞれの数値は、ある物理定数を表しています。該当する物理定数名を答えてください。
- (0x66ff0bbd)H
- (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型の変換結果とも比較してください。
それでは、数値をプログラムに入力し確認してみましょう。
(3)float型に格納されていた値を16進数で表記したものを、10進数に変換しましょう。計算には電卓を使用して結構です。それぞれの数値は、ある物理定数を表しています。該当する物理定数名を答えてください。