2009-09-19 16 views
13

我得到一個線的兩點爲什麼不會崩潰?我不是在這裏除以零嗎?

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

界如果我給它一個零尺寸線的斜率,

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

float sxy = slopeXY(p1, p2); 

我不零錯誤得到鴻溝。

+14

您似乎找到了一種方法來除以零。小心使用它,否則你可能會在時空中撕裂一個洞,我們的世界將被無窮無盡的吞噬。 – 2009-09-19 18:09:52

回答

28

使用OS X上的默認浮點環境,浮點除以零不會導致陷阱或異常。 0.0/0.0將返回一個NaN並在fpscr中引發無效浮點狀態標誌。將非零值除以0.0將返回無窮大並提高除零標誌。

您可以檢查這些條件,如果需要,使用isnan()和isinf()函數在math.h中定義

4

除以零錯誤僅發生於整數除法。 對於浮動,通常你會得到無窮大,除非股利爲零。

1

浮點錯誤通常不會引發異常。

1

因爲它是未定義的行爲。你的程序允許以任何方式行事,這可能包括崩潰或向我們展示你被零除以如此不經意地毀壞的宇宙的最後一瞥。

從C [99]標準,§6.5.5.5:

/運算的結果是從由所述第二的第一個操作數 的劃分 商數; %運算符爲 的結果爲餘數。在兩個操作中,如果 第二個操作數的值爲零,則行爲 未定義。

+4

行爲是* not * undefined,因爲OS X編譯器符合相同標準的附錄F. C [99]的F.3.1節說:「+, - ,*和/運算符提供了IEC 60559加,減,乘和除運算」,IEC60559/IEEE-754規定了除零的結果。 – 2009-09-20 17:36:59

+0

哦。那只是爲了花車嗎? – aib 2009-09-22 07:02:43