型について理解を深めてもらうために、整数型と浮動小数点数型がコンピュータ内ではどのように表現されているかについて解説し、それらを実際にプログラムを使って確認してみました。高級プログラミング言語を使っていれば、コンピュータは二進数しか扱えないということを意識しなくてもプログラムは組めますが、正確な計算をしているとは限りません。正確な計算が求められる場合には、こういった内部表現についても理解しておけば対応ができるようになります。普段は64けたの二進数といったものを見る気は出てきませんが、今回のようにチェックしてみると意外と興味がわくのではないでしょうか。
なお、プリミティブ型よりも柔軟な計算をしたいときのために、Javaではjava.math.BigIntegerクラスやjava.math.BigDecimalクラスといったものが用意されています。場合によってはそういったクラスを採用することも検討するといいかもしれません。
今回は数値の内部表現について解説をしましたが、次回は文字の表現について解説をします。ネットワークに接続されたいろいろな環境で動作するコンピュータと通信するプログラムなどでは、文字がコンピュータ内部でどのように表現されているかを正しく理解している必要があります。お楽しみに。
public class Sample540
private static int BIAS = 1023;
private double d;
private long l;
private String sign;
private long exponent;
private String mantissa;
private String bitImage;
public Sample540(String s) {
if ("-".equals(s.substring(0,1))) {
sign = "1";
} else {
sign = "0";
}
d = Double.parseDouble(s);
l = Double.doubleToLongBits(d);
bitImage = getBitImage();
}
public double getData() {
return d;
}
public String getBitImage() {
if (bitImage != null) {
return bitImage;
}
String lb = Long.toBinaryString(l);
int longBitLength = lb.length();
for (int i = 64; i > longBitLength; i--) {
lb = "0" + lb;
}
bitImage = lb;
return bitImage;
}
public String getSign() {
return sign;
}
public long getExponent() {
String s = getBitImage().substring(1, 12);
exponent = Long.valueOf(s, 2).longValue() - BIAS;
return exponent;
}
public String getExponentBits() {
String s = getBitImage().substring(1, 12);
return s;
}
public String getMantissa() {
if (getExponent() == -BIAS) {
mantissa = "0." + getBitImage().substring(12, 64);
} else {
mantissa = "1." + getBitImage().substring(12, 64);
}
return mantissa;
}
public void print() {
System.out.println("data :" + getData());
System.out.println("sign : "+getSign());
System.out.print("exponent : "+getExponentBits());
System.out.println(" ("+ getExponent()+")");
System.out.println("mantissa : "+getMantissa());
System.out.println("bit image:");
System.out.print(" ---6---------5---------4---------3");
System.out.println("---------2---------1---------0");
System.out.println(" "+getBitImage());
System.out.println("");
}
public static void main(String[] args) {
String[] ds = { "1.0", "2.0", "1024.0", "1000.0",
"0.5", "0.25", "2.5", "118.625" };
Sample540 d;
for (int i=0 ; i<ds.length ;? i++) {
d = new Sample540(ds[i]);
d.print();
d = new Sample540("-"+ds[i]);
d.print();
}
}
}
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクト(http://www.jajakarta.org/)へ参加し、コミッタの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)(http://www.sssg.org/)やbugs(J)(http://www.bugs.jp/)の活動へも参加している。
Copyright © ITmedia, Inc. All Rights Reserved.