【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

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));

}



}

A 回答 (3件)

理解しやすくするために、


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になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/02 16:55

Javaのdouble型の最大値は、1.7976931348623157E308です。

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

10e308 は、おそらくdouble の表現範囲を超えています


BigDecimal クラスを使ってみてはどうでしょうか
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!