整数を0で割ると、例外ArithmeticExceptionが発生します。
ですが、整数を0.0(浮動小数点)で割るか、浮動小数点を0で
割る場合には、Infinityとなりますが、このように現れるもの
が異なる(クラスのインスタンスがスロー、Static変数(定数))のは
どうしてなのだろうと思いました。
これらの性質の違いをご教授下さい。
http://www-6.ibm.com/jp/developerworks/java/030314/j_j-jtp0114.h...
dW : Java technology : Java理論と実践: ポイントは何処ですか?
実数演算の場合はIEEE 754の規格に従うからです。(整数を0.0で割るか、浮動小数点を0で
割る場合は実数演算となる)
で、なぜこんなふうに決めてあるかというと、実数演算の場合、繰り返し計算などで分母が限りなく小さくなるケースがあり、このケースは整数の確実(?)な0とは意味合いが異なってくるからでしょう。
極限を考えてもらえればわかってもらえるかと思います。
整数の0で割るケースはあきらかに異常で、通常定義されません。
http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/lang/Float.html
Java 2 Platform SE 1.3: $B%/%i%9(B Float
URLはダミーです。
整数型の0は0以外の何者でもありませんが、浮動小数点型の0.0は0という意味以外に「0ではないが精度が足りなくて0.0と表現している」という意味を持つケースがあるからです。
こんなソースを書いてみました。
float a = 1.0E9f;
a = 1.0f / a / a / a / a / a / a;
System.out.println(a); //=>0.0
a = 1.0f / a;
System.out.println(a); //=>Infinity
a = 1.0E9f;
a = -1.0f / a / a / a / a / a / a;
System.out.println(a); //=>-0.0
a = 1.0f / a;
System.out.println(a); //=>-Infinity
a = -1.0f / a / a / a / a / a / a;
a = 0.0f / a;
System.out.println(a); //=>NaN
途中で精度が足りなくなって、0.0や-0.0という表示が出てきているのが判ると思います。
ですがそれは本当の0ではありません。
そういうことで浮動小数点では0.0で割ることが許されている(=例外が発生しないという意味)と考えていいでしょう。
整数を0.0で割ったり、浮動小数点を0で割ったりした場合は、単に整数が小数点型に自動的に型変換されているだけで議論は同じです。
quintiaさん
昨日もご解答&トラックバックによる丁寧な補足
説明をありがとうございました。
やはり±0.0という値は、(限りなく)0に近いと
いう代物なのですね。納得です。
今回もご解答ありがとうございました。
0.0等の浮動小数点での計算と、きっぱりと
した”0”では異なってくるわけですね。
この”きっぱりとした整数0”で割った値は
存在しない、また0.0はこの”きっぱりとした
整数0”とは厳密には値が異なる(一致するとは
限らない)ものと解釈しました。
ご解答ありがとうございます。