私はそれがコードからかなり自明だと思います。明らかに、私は同じことを何度も評価しているわけではなく、私の問題を説明するための単なる例です。オーバー/アンダーフローだと思いますが、対処方法がわかりません。
double d = (1 / (684985+157781));
System.out.println(d); // returns 0.0
System.out.println(Math.log(d)); // returns -Infinity.
(1 / (684985+157781))
は整数式なので、 になります0
。次に、ゼロが に割り当てられdouble d
ます0.0
。
1
toを変更して、1.0
その式を強制的に float にするか1.0D
、強制的に double にしてみてください。
整数除算によって行われた別の人:
double d = (1.0 / (684985.0+157781.0));
いいえ、Java で整数を使用する場合、除算の結果は再び整数になります。少なくとも 1 つのオペランドを double にキャストする必要があります。
double d = (1 / (double)(684985+157781));
使ってみてdouble d = (1.0 / (684985+157781));
1.0
二重評価を強制したい部分に注意してください。
その最初の式は、整数演算で計算されます。期待する答えを得るには、浮動小数点演算で計算する必要があるため、次のようになります。
double d = (1.0 / (684985.0+157781.0));