3

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

double d = (1 / (684985+157781));

System.out.println(d); // returns 0.0
System.out.println(Math.log(d)); // returns -Infinity.
4

5 に答える 5

8

(1 / (684985+157781))は整数式なので、 になります0。次に、ゼロが に割り当てられdouble dます0.0

1toを変更して、1.0その式を強制的に float にするか1.0D、強制的に double にしてみてください。

于 2011-12-11T21:09:07.063 に答える
7

整数除算によって行われた別の人:

double d = (1.0 / (684985.0+157781.0));
于 2011-12-11T21:07:19.093 に答える
5

いいえ、Java で整数を使用する場合、除算の結果は再び整数になります。少なくとも 1 つのオペランドを double にキャストする必要があります。

double d = (1 / (double)(684985+157781));
于 2011-12-11T21:07:47.080 に答える
4

使ってみてdouble d = (1.0 / (684985+157781));

1.0二重評価を強制したい部分に注意してください。

于 2011-12-11T21:07:39.053 に答える
3

その最初の式は、整数演算で計算されます。期待する答えを得るには、浮動小数点演算で計算する必要があるため、次のようになります。

double d = (1.0 / (684985.0+157781.0));
于 2011-12-11T21:07:44.317 に答える