私はそれがコードからかなり自明だと思います。明らかに、私は同じことを何度も評価しているわけではなく、私の問題を説明するための単なる例です。オーバー/アンダーフローだと思いますが、対処方法がわかりません。
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。
1toを変更して、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));