web-dev-qa-db-ja.com

0によるc ++除算

長いシミュレーションを実行しています。結果をベクトルに記録して、データに関する統計を計算します。理論的には、これらのサンプルはゼロによる除算の結果である可能性があることに気付きました。これは理論上のものにすぎませんが、そうではないと確信しています。コードを変更した後でシミュレーションを再実行しないようにするために、その場合はどうなるのだろうと思いました。 0による除算が発生したかどうかを知ることができますか?エラーメッセージは表示されますか? (現在、例外は処理されていません)。

ありがとう

17
Bob

IEEE浮動小数点数の場合、ゼロ以外の有限の浮動小数点数の0による除算は明確に定義されており、+ infinity(値がゼロより大きい場合)または-infinity(値がゼロ未満の場合)になります。 0.0/0.0の結果はNaNです。整数を使用する場合の動作は未定義です。

36
etarion

C標準は(6.5.5)と言っていることに注意してください:

/演算子の結果は、最初のオペランドを2番目のオペランドで除算した商です。 %演算子の結果が余りです。どちらの演算でも、第2オペランドの値がゼロの場合の動作は未定義です。

つまり、something/0は、整数型と浮動小数点の両方について(標準では)未定義です。それにもかかわらず、ほとんどの実装では、前述の動作(+ -INFまたはNAN)があります。

整数を話している場合、プログラムはゼロ除算でクラッシュするはずです。

浮動小数点数を話している場合は、ゼロによる除算が許可され、その結果はINFまたは-INFです。プログラムがクラッシュするか、うまく処理するか、続行するかは、コード次第です。未定義/予期しない結果。

3
Shinnok

IEEE floatを使用する場合、0またはNaNを返します。 op1が0の場合、未定義になります。 op1が0より大きい場合、無限大になります。 op1が0より小さい場合、-Infinityを取得します。直接または整数で0による除算を使用すると、「浮動小数点例外」エラーが発生します。

1
goblin01

整数と浮動小数点数のどちらを使用しているかによって異なります。整数の場合、ランタイム例外が発生します。浮動小数点数の場合、結果は+/-無限大、またはNaNは(0.0/0.0)で、std::isnan()を使用してテストできます。

1
Daniel Gehriger