28

ゼロ除算に関して、標準は次のように述べています。

C99 6.5.5p5 - / 演算子の結果は、第 1 オペランドを第 2 オペランドで割った商です。% 演算子の結果は剰余です。どちらの操作でも、2 番目のオペランドの値がゼロの場合、動作は未定義です。

C++03 5.6.4 - 二項 / 演算子は商を生成し、二項 % 演算子は最初の式を 2 番目の式で割った剰余を生成します。/ または % の 2 番目のオペランドがゼロの場合、動作は未定義です。

上記の段落を額面どおりに受け取るとしたら、答えは明らかに両方の言語の未定義の動作です。ただし、C99 標準をさらに下に見ると、矛盾しているように見える次の段落が表示されます(1)。

C99 7.12p4 - マクロ INFINITY は、利用可能な場合、正または符号なし無限大を表す float 型の定数式に展開されます。

標準には、未定義の動作が (潜在的に) 矛盾するステートメントに取って代わられない、ある種の黄金律がありますか? それを除けば、実装で INFINITY マクロが定義されている場合、ゼロによる除算はそのように定義されていると結論付けるのは不合理ではないと思います。ただし、実装でそのようなマクロが定義されていない場合、動作は未定義です。

2 つの言語のそれぞれについて、この問題に関するコンセンサスが (あるとすれば) どのようなものなのか、興味があります。int i = 1 / 0整数除算と浮動小数点除算について話している場合、答えは変わりfloat i = 1.0 / 0.0ますか?

注 (1)<cmath> C++03 標準では、INFINITY マクロを含むライブラリについて言及されています。

4

8 に答える 8

30

矛盾は見られません。ゼロによる除算は未定義、ピリオド。引用されたテキストのどこにも「... 無限大が定義されていない限り」という言及はありません。

数学のどこにも 1 / 0 =無限大と定義されていないことに注意してください。そのように解釈する人もいるかもしれませんが、それは健全な事実ではなく、個人的な「近道」スタイルの解釈です。

于 2010-06-09T08:24:05.563 に答える
14

1 / 0 は無限大ではありません。

リム 1/x = ∞ (x -> +0)

于 2010-06-09T08:24:23.850 に答える
4

なぜでしょうか?

それは数学的に意味がありません.1 / xが一般的に数学で∞と定義されているわけではありません. また、少なくともあと 2 つのケースが必要です: -1/ xと 0/ xは ∞ にも等しくなりません。

一般にゼロ除算を参照してください。特に、コンピュータ演算に関するセクションを参照してください。

于 2010-06-09T08:22:25.520 に答える
2

を定義する実装__STDC_IEC_559__は、附属書 F で指定された要件を順守する必要があり、これには、IEC 60559 と一致する浮動小数点セマンティクスが必要です。標準は、定義しない実装でのゼロによる浮動小数点除算の動作に要件を課しません__STDC_IEC_559__。しかし、それを定義する人のために行います。IEC 60559 では動作が指定されているが、C 標準では指定されていない場合、定義するコンパイラは__STDC_IEC_559__、C 標準では、IEC 標準で説明されているように動作する必要があります。

IEC 60559 (または米国標準 IEEE-754) で定義されているように、ゼロによるゼロ除算は NaN を生成し、正のゼロまたはリテラル定数ゼロによる浮動小数点数の除算は被除数と同じ符号を持つ INF 値を生成し、除算は負のゼロによる浮動小数点数の は、反対の符号を持つ INF を生成します。

于 2016-07-20T19:41:43.980 に答える
1

INFINITY マクロの場合: IEEE754 標準では、+/- 無限大を表す明示的なコーディングがあります。これは、すべての指数ビットが設定され、すべての小数ビットがクリアされている場合です (小数ビットが設定されている場合、NaN を表します)。

私のコンパイラでは(int) INFINITY == -2147483648、 に評価される式はint i = 1/0、INFINITIY が返された場合、間違いなく間違った結果を生成します。

于 2010-06-09T08:54:23.483 に答える
1

私はC99ドラフトしか持っていません。§7.12/4 では次のように述べています。

マクロ

    INFINITY

可能な場合、正または符号なし無限大を表す float 型の定数式に展開されます。float else は、変換時にオーバーフローする型の正の定数に変換されます。

INFINITY必ずしもゼロ除算ではなく、浮動小数点オーバーフローに関して定義できることに注意してください。

于 2010-06-09T08:28:56.103 に答える