4

たとえば、算術式があります。

float z = 8.0
float x = 3.0;
float n = 0;
cout << z / (x/n) + 1 << endl;

「nan」、「1.#inf」などのはずなのに、なぜ通常の応答が 1 になるのですか?

4

2 に答える 2

5

あなたは浮動小数点演算を使用していると思います (あなたが教えてくれないので、確かではありませんが)。

IEEE754 浮動小数点セマンティクスは、拡張された実数行で機能し、両端に無限大を含みます。これにより、任意の(非 NaN) 分母に対して非ゼロの分子を使用した除算が明確に定義され、通常の算術規則に「一致」する (つまり、連続して拡張される) ようx / nになりzます。としての表現n * z / x

真に定義されていない量は 0/0 と inf/inf だけで、特別な値 NaN で表されます。

于 2013-10-05T11:37:21.590 に答える
2

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 != 0x != NaN && x != Inf && x != -Inf. フロートの場合x == 1、結果は-5.9604645e-8. したがって、この場合の 0 による除算のように、すべての期待を簡単に転送できるわけではありません。

C/C++ は浮動小数点数に IEE 754 仕様を使用することを義務付けていませんが、これは現在の仕様であり、事実上すべてのハードウェアに実装されており、そのためほとんどの C/C++ 実装で使用されています。

于 2013-10-05T11:41:53.960 に答える