1. ホーム
  2. floating-point

[解決済み] 2つの不等な浮動小数点数の引き算で0を得ることは可能ですか?

2022-07-04 01:42:01

質問

以下の例で、0(または無限大)による除算は可能でしょうか?

public double calculation(double a, double b)
{
     if (a == b)
     {
         return 0;
     }
     else
     {
         return 2 / (a - b);
     }
}

通常の場合、もちろんそれはありません。しかし、もし ab が非常に近い場合 (a-b) であることになる。 0 になるのは、計算の精度のせいでしょうか?

なお、この質問はJavaのものですが、ほとんどのプログラミング言語に適用されると思います。

どのように解決するのですか?

Javaでは a - b とは決して等しくありません。 0 もし a != b . これは、Javaが非正規化された数をサポートするIEEE 754浮動小数点演算を義務付けているためです。から スペック :

特に、Java プログラミング言語では、IEEE 754 非正規化浮動小数点数および漸進的アンダーフローのサポートが必要であり、これにより特定の数値アルゴリズムの望ましい特性を容易に証明することができるようになります。浮動小数点演算は、計算結果が非正規化された数である場合、ゼロにフラッシュされません。

もし FPU で動作する 非正規化された数値 で動作し、不等号の引き算は(掛け算と違って)決してゼロを生成しない、また この質問 .

他の言語については、それは依存します。例えばCやC++では、IEEE754のサポートはオプションです。

とはいえ は可能です という表現に対して 2 / (a - b) をオーバーフローさせることができます。 a = 5e-308b = 4e-308 .