JAVAの演算子に関して質問です。

整数を0で割ると、例外ArithmeticExceptionが発生します。
ですが、整数を0.0(浮動小数点)で割るか、浮動小数点を0で
割る場合には、Infinityとなりますが、このように現れるもの
が異なる(クラスのインスタンスがスロー、Static変数(定数))のは
どうしてなのだろうと思いました。
これらの性質の違いをご教授下さい。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/08/03 21:13:43
  • 終了:--

回答(2件)

id:terra5 No.1

terra5回答回数57ベストアンサー獲得回数02005/08/03 21:47:05

ポイント25pt

http://www-6.ibm.com/jp/developerworks/java/030314/j_j-jtp0114.h...

dW : Java technology : Java理論と実践: ポイントは何処ですか?

実数演算の場合はIEEE 754の規格に従うからです。(整数を0.0で割るか、浮動小数点を0で

割る場合は実数演算となる)

で、なぜこんなふうに決めてあるかというと、実数演算の場合、繰り返し計算などで分母が限りなく小さくなるケースがあり、このケースは整数の確実(?)な0とは意味合いが異なってくるからでしょう。

極限を考えてもらえればわかってもらえるかと思います。

整数の0で割るケースはあきらかに異常で、通常定義されません。

id:mimio17

0.0等の浮動小数点での計算と、きっぱりと

した”0”では異なってくるわけですね。

この”きっぱりとした整数0”で割った値は

存在しない、また0.0はこの”きっぱりとした

整数0”とは厳密には値が異なる(一致するとは

限らない)ものと解釈しました。

ご解答ありがとうございます。

2005/08/03 22:06:04
id:quintia No.2

quintia回答回数562ベストアンサー獲得回数712005/08/03 22:19:55

ポイント25pt

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で割ったりした場合は、単に整数が小数点型に自動的に型変換されているだけで議論は同じです。

id:mimio17

quintiaさん

昨日もご解答&トラックバックによる丁寧な補足

説明をありがとうございました。

やはり±0.0という値は、(限りなく)0に近いと

いう代物なのですね。納得です。

今回もご解答ありがとうございました。

2005/08/03 22:25:58

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません