1

私は次のCプログラムを持っています:

#include <stdio.h>

int main()
{
double x=0;
double y=0/x;
if (y==1)
  printf("y=1\n");
else
  printf("y=%f\n",y);
if (y!=1)
  printf("y!=1\n");
else
  printf("y=%f\n",y);

return 0;
}

私が得る出力は

y=nan
y!=1

しかし、行を変更すると、double x = 0; int x =0; 出力は次のようになります

Floating point exception

誰かが理由を説明できますか?

4

7 に答える 7

2

整数演算で除算0/0を行っています(これは無効であり、表示される例外が発生します)。の種類に関係なく、y最初に評価されるのは0/xです。

xであると宣言されるとdouble、ゼロもaに変換され、double浮動小数点演算を使用して演算が実行されます。

xであると宣言されている場合、1つの0を別の0intで除算しているため、結果は無効です。int

于 2011-08-01T18:48:47.927 に答える
1

IEEE 754により、浮動小数点数(、、、、など)に対して不正な操作を実行するとNaNが生成される0/0ため∞×0ですsqrt(−1)

実際には、シグナリングとクワイエットの2種類のNaNがあります。算術演算(数値比較を含む)でシグナリングNaNを使用すると、「無効な」例外が発生します。静かなNaNを使用すると、結果もNaNになります。

標準で指定されているNaNの表現には、エラーのタイプをエンコードするために使用できる未指定のビットがいくつかあります。しかし、そのエンコーディングの標準はありません。理論的には、シグナリングNaNをランタイムシステムで使用して、通常の値での計算を遅くすることなく、浮動小数点数を他の特別な値で拡張できます。ただし、このような拡張機能は一般的ではないようです。

また、ウィキペディアはゼロによる整数除算についてこれを述べています:

結果の整数表現がないため、ゼロによる整数除算は通常、浮動小数点とは異なる方法で処理されます。一部のプロセッサは、整数をゼロで除算しようとすると例外を生成しますが、他のプロセッサは単に続行して、除算に対して誤った結果を生成します。結果は、除算の実装方法によって異なり、ゼロになる場合もあれば、可能な最大の整数になる場合もあります。

于 2011-08-01T18:52:13.473 に答える
0

整数データ型の最小値と最大値を確認してください。未定義またはnanの結果がその範囲内にないことがわかります。

そして、これをすべてのコンピューター科学者が浮動小数点について知っておくべきことを読んでください。

于 2011-08-01T18:48:39.573 に答える
0

0による整数除算は不正であり、処理されません。一方、フロート値はNaNCを使用して処理されます。次のように動作します。

int x=0;
double y = 0.0 / x;
于 2011-08-01T18:49:36.720 に答える
0

IEE754には、浮動小数点のゼロ除算NaNの結果として示される特別なビットパターンがあります。

ただし、整数演算を使用する場合はそのような表現がないため、システムはを返す代わりに例外をスローする必要がありますNaN

于 2011-08-01T18:53:30.187 に答える
0

に除算intするintと、0で除算できます。

0/0ダブルスでですNaN

int x=0;
double y=0/x; //0/0 as ints **after that** casted to double. You can use
double z=0.0/x; //or
double t=0/(double)x; // to avoid exception and get NaN
于 2011-08-01T19:06:00.537 に答える
-1

浮動小数点は、本質的に、制限された精度で実数をモデル化しています。ビットパターンの数は有限ですが、実数は無限(連続!)です。もちろん、それは最善を尽くし、与えられた正確な入力に最も近い表現可能な実数を返します。小さすぎて直接表現できない回答は、代わりにゼロで表されます。ゼロ除算は実数の誤差です。ただし、浮動小数点では、これらの非常に小さい回答からゼロが発生する可能性があるため、x / 0.0(正のxの場合)を「正の無限大」または「大きすぎて表現できない」と見なすと便利です。これは、x=0.0の場合は役に立ちません。

私たちが言える最善のことは、ゼロをゼロで割ることは、実際には「ゼロと区別できない小さなものを、ゼロと区別できない小さなもので割ること」であるということです。これに対する答えは何ですか?まあ、0/0の正確なケースに対する答えはなく、それを不正確に扱う良い方法はありません。それは相対的な大きさに依存するので、プロセッサは基本的に肩をすくめて、「数値ではない」を返すことで「すべての精度を失った-あなたに与えた結果は誤解を招くだろう」と言います。

対照的に、ゼロによる整数除算を行う場合、除数は実際には正確にゼロを意味するだけです。一貫した意味を与える方法はありません。そのため、コードが答えを求めたとき、それは実際には不正なことをしています。

(2番目のケースでは整数除算ですが、Cの昇格規則のため、最初のケースではありません。0は整数リテラルと見なすことができ、両側が整数であるため、除算は整数除算です。最初のケースでは、がx2倍であると、配当が2倍に昇格します。をで置き換えると00.0タイプに関係なく、浮動小数点除算になりxます。)

于 2011-08-01T19:00:52.930 に答える