我知道當一些值由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作爲輸出
我知道當一些值由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作爲輸出
(限制本回答IEEE754)。
這是只有可能的,如果條件之一是NaN,或者在陣列a
或b
,或讀取未初始化數據的邊界之外的訪問未定義行爲的一些表現。
在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
是負數。
@Bathseba,大聲笑現在我得到nan的值,這是早先給出明確的輸出 –
你需要把一些代碼檢查所有的輸入。調用堆棧的實際原因會更高。 (類似於0.0/0.0生成一個NaN)。 – Bathsheba
@巴瑟巴,謝謝你!這是一個有點邏輯的錯誤 –
發生這種情況時,有哪些類型和輸入值?添加代碼來檢測'nan'和break,使用調試器來檢查傳入的值。有時它只是「垃圾進入,垃圾出來」。 – unwind
調試是你做的第一件事。所以,完成那個 –
@TusharChandra:請不要親自採取降壓措施。對於這個問題,我沒有看到任何問題;也許雖然你可以縮短到兩個陳述,並整理標題一點。很難爲這些事情制定一個有效的例子,假設IEEE754,答案是具體的。 – Bathsheba