次の例では、0 (または無限大) による除算が可能ですか?
public double calculation(double a, double b)
{
if (a == b)
{
return 0;
}
else
{
return 2 / (a - b);
}
}
もちろん、通常はそうなりません。しかし、a
と がb
非常に近い場合は、計算の精度によって という結果(a-b)
になるのでしょうか?0
この質問は Java に関するものですが、ほとんどのプログラミング言語に当てはまると思います。
ベストアンサー1
Javaでは、がa - b
と等しくなることはありません。これは、Javaが非正規化数をサポートするIEEE 754浮動小数点演算を義務付けているためです。0
a != b
スペック:
特に、Java プログラミング言語では、IEEE 754 の非正規化浮動小数点数と段階的アンダーフローのサポートが必要です。これにより、特定の数値アルゴリズムの望ましい特性の証明が容易になります。計算結果が非正規化数である場合、浮動小数点演算は「ゼロにフラッシュ」されません。
もしFPUで動作します非正規化数異なる数の引き算ではゼロは生じない(掛け算と異なる)。この質問。
他の言語の場合は状況によって異なります。たとえば、C または C++ では、IEEE 754 のサポートはオプションです。
そうは言っても、可能です式が2 / (a - b)
オーバーフローする場合、たとえばa = 5e-308
およびを使用しますb = 4e-308
。