2009-09-19 11 views
13

私はそれをゼロサイズのライン、なぜこれがクラッシュしないのですか?ここでゼロで割るのではないですか?

CGPoint p1 = CGPointMake(0, 10); 
CGPoint p2 = CGPointMake(0, 10); 

float sxy = slopeXY(p1, p2); 

を与える場合は、私がゼロ除算エラーを取得しない二つの点

float slopeXY(CGPoint p1, CGPoint p2) 
{ 
    return ((p2.y - p1.y)/(p2.x - p1.x)); 
} 

で囲まれた直線の傾きを取得しています。

+14

あなたはゼロで割り切る方法を見つけたようです。これを慎重に使用するか、時空間で穴を開けると、私たちの世界は無限に呑み込まれます。 –

答えて

28

OS Xのデフォルトの浮動小数点環境では、ゼロによる浮動小数点除算ではトラップまたは例外が発生しません。 0.0/0.0では代わりにNaNが返され、fpscrに無効な浮動小数点ステータスフラグが立てられます。ゼロ以外の値を0.0で除算すると、無限大が返され、ゼロ除算フラグが立てられます。あなたがする必要がある場合

あなたは

4

除算エラーゼロでのみ整数の除算のために起こるのmath.hで定義されてISNAN()とISINF()関数を使用して、これらの条件を確認することができます。 floatの場合、通常は、被除数がゼロでない限り、無限大になります。

1

通常、浮動小数点エラーは例外を発生させません。

1

これは未定義の動作だからです。あなたのプログラムは、いかなる方法でも動作することが許されています。これには、ゼロで割ることによって控えめに破壊された宇宙の最後の垣間見ることが含まれます。 C [99]規格から

は、§6.5.5.5:

/演算子の結果は、第によって第一 オペランドの分割から 商です。 の結果は%演算子が剰余です。 の両方のオペレーションでは、 第2オペランドの値がゼロの場合、動作 は定義されていません。

+4

OS Xコンパイラは同じ標準の附属書Fに準拠しているため、動作は*未定義です。 C [99]のF.3.1節では、+、 - 、*、および/ /演算子はIEC 60559の加算、減算、乗算、および除算演算を提供し、IEC60559/IEEE-754はゼロ除算の結果を示します。 –

+0

ああ。それは浮動小数点のためだけですか? – aib

関連する問題