2017-06-22 134 views
0

我知道當一些值由0 但在我的情況下分割,這個錯誤通常發生:我的代碼正在生成一個輸出「NaN」。爲什麼?

c[0]=((a[1]*b[2])-(a[2]*b[1])); 
c[1]=((a[2]*b[0])-(a[0]*b[2])); 
c[2]=((a[0]*b[1])-(a[1]*b[0])); 
cout<<c[0]<<c[1]<<c[2]; 

這段代碼有時產生的NaN作爲輸出

+4

發生這種情況時,有哪些類型和輸入值?添加代碼來檢測'nan'和break,使用調試器來檢查傳入的值。有時它只是「垃圾進入,垃​​圾出來」。 – unwind

+0

調試是你做的第一件事。所以,完成那個 –

+0

@TusharChandra:請不要親自採取降壓措施。對於這個問題,我沒有看到任何問題;也許雖然你可以縮短到兩個陳述,並整理標題一點。很難爲這些事情制定一個有效的例子,假設IEEE754,答案是具體的。 – Bathsheba

回答

2

(限制本回答IEEE754)。

這是只有可能的,如果條件之一是NaN,或者在陣列ab,或讀取未初始化數據的邊界之外的訪問未定義行爲的一些表現。

在IEEE754下,不能通過大數值的乘法獲得NaN。

從C++ 11,你可以用std::isnan檢測NaN,在此之前或C,使用成語

if (f != f){ 
    // `f` is NaN 
} 

因此,設定不確定的行爲不談,問題的原因是更高的調用堆棧。諸如0.0/0.0的表達式將生成一個NaN。


關於你的聲明

一些值由0

分爲 「一些價值」,當由0.0分的只有價值給您楠0:0.0/0.0是NaN,並且a/0.0是+ Inf,如果a是正數,並且-Inf如果a是負數。

+0

@Bathseba,大聲笑現在我得到nan的值,這是早先給出明確的輸出 –

+0

你需要把一些代碼檢查所有的輸入。調用堆棧的實際原因會更高。 (類似於0.0/0.0生成一個NaN)。 – Bathsheba

+0

@巴瑟巴,謝謝你!這是一個有點邏輯的錯誤 –

相關問題