たとえば、算術式があります。
float z = 8.0
float x = 3.0;
float n = 0;
cout << z / (x/n) + 1 << endl;
「nan」、「1.#inf」などのはずなのに、なぜ通常の応答が 1 になるのですか?
たとえば、算術式があります。
float z = 8.0
float x = 3.0;
float n = 0;
cout << z / (x/n) + 1 << endl;
「nan」、「1.#inf」などのはずなのに、なぜ通常の応答が 1 になるのですか?
あなたは浮動小数点演算を使用していると思います (あなたが教えてくれないので、確かではありませんが)。
IEEE754 浮動小数点セマンティクスは、拡張された実数行で機能し、両端に無限大を含みます。これにより、任意の(非 NaN) 分母に対して非ゼロの分子を使用した除算が明確に定義され、通常の算術規則に「一致」する (つまり、連続して拡張される) ようx / n
になりz
ます。としての表現n * z / x
。
真に定義されていない量は 0/0 と inf/inf だけで、特別な値 NaN で表されます。
IEEE 754 はそれ3/0 = Inf
(または 3 の代わりに正の値) を指定します。 8/Inf
は 0 を返します。1 を足すと 1 になります。これは、0
が「0 またはそれに非常に近いもの」およびInf
「無限大または非常に大きな数」を表すためです。また、実数を無限に効果的に拡張するため、制限に対していくつかの操作を実行することもできます。NaN
は、制限が達成できない場合 (または単純な実装では簡単に計算できない場合) に予約されます。
0 == -0
副作用として、 but1/0 == Inf
やのようないくつかの奇妙な効果があり1/-0 == -Inf
ます。FP 演算は正常ではないことを覚えておくことが重要です。たとえばcos(x) * cos(x) + sin(x) * sin(x) - 1 != 0
、x != NaN && x != Inf && x != -Inf
. フロートの場合x == 1
、結果は-5.9604645e-8
. したがって、この場合の 0 による除算のように、すべての期待を簡単に転送できるわけではありません。
C/C++ は浮動小数点数に IEE 754 仕様を使用することを義務付けていませんが、これは現在の仕様であり、事実上すべてのハードウェアに実装されており、そのためほとんどの C/C++ 実装で使用されています。