こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaで1.8x10の308乗÷(ー1.8x10の308)乗割り算をしたいです。

java初心者です。下記の割り算するプログラムが
できません。ご指導下さい。実行結果はコメントどめ
しました。
/*num1=1.8x10^308,num2=1.8x10^308としnum1/num2,(-num1)÷(-num2)、num1/0を計算する。
実行結果
C:\keisanclass>java WarizanMain 1.8 1.8
NaN 演算不可能と表示されました。

C:\keisanclass>java WarizanMain -1.8 -1.8
NaN 演算不可能と表示されました。

C:\keisanclass>java WarizanMain 1.8 0
Infinity 無限大と表示されました。
*/
class WarizanMain {
public static void main(String args[]) {

double num1=0.0;
double num2=0.0;
num1=Double.parseDouble(args[0]);
num2=Double.parseDouble(args[1]);
double z = Math.pow(10,308);

System.out.println((num1*z)/(num2*z));

}



}

投稿日時 - 2006-05-28 23:21:29

QNo.2181374

すぐに回答ほしいです

質問者が選んだベストアンサー

理解しやすくするために、
System.out.println((num1*z)/(num2*z));
の前に
System.out.println(num1*z);
System.out.println(num2*z);
の2行を入れましょう。これで、何を何で割ろうとしているのかがわかるようになります。

次に、
System.out.println(Double.MAX_VALUE);
という1行をどこかに入れてみてください。結果、
1.7976931348623157E308
と表示されると思います。
つまり、
1.8×10^308はdoubleの最大値をオーバーしてしまうので、1.8 1.8のときはnum1とnum2にはInfinityが代入されます。∞÷∞は計算できないので、NaN(Not a Number)が表示されます。

次に、-1.8 -1.8のときは同様にnum1とnum2には-Infinityが代入されます。(-∞)÷(-∞)も計算できないのでNaNです。

最後に、1.8 0のときはnum1にInfinity、num2に0が代入されます。このとき∞÷0になりますが、javaでは分子が0でなく、分母が0のときには便宜上Infinityと計算されます。(もちろん数学的には0で割ってはいけないのですが)よってInfinityが表示されます。(もちろんnum1が-Infinityなら答えは-Infinityです)

ちなみに0 0だとこれは計算できないとしてNaNになります。

投稿日時 - 2006-05-29 00:01:19

お礼

ご返事遅くなり本当に申し訳ありません。
本当にありがとうございます。
説明が大変に丁寧で恐縮してしまいます。
そして大変に詳しくわかりやすいご説明ありがとうございました。まだよくわからないのでよく読んでみます。

投稿日時 - 2006-10-02 16:55:12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

Javaのdouble型の最大値は、1.7976931348623157E308です。(Double.MAX_VALUEで定義されています)
従って、「1.8x10^308」は、ぎりぎりのところでオーバフローしているのではないでしょうか?
No.2でも、言われているように、BigDecimalを使うのがいいのではと思います。

投稿日時 - 2006-05-29 12:10:26

ANo.2

10e308 は、おそらくdouble の表現範囲を超えています
BigDecimal クラスを使ってみてはどうでしょうか

投稿日時 - 2006-05-29 00:09:27

あなたにオススメの質問