我正在編寫一個項目工作,我的最新問題是輸出NaN後一段時間(然後堅持,當然),但以我有限的知識,我不明白爲什麼。我讀了一些關於NaN通常來自何處的地方(0/0,inf * 0等),但這似乎並不是這種情況。而整個代碼過於漫長而複雜,張貼在這裏,我已經確定的代碼的情況下它似乎來自:C++意外的NaN
long double force_dipol(particle &part1, particle &part2, long double distance) {
if ((abstand(part1.dummyd)!=0) && (abstand(part2.dummyd)!=0) { //Division checks
long double ret;
ret = 3.*(part1.dummyd[0]*part2.dummyd[0] + part1.dummyd[1]*part2.dummyd[1] + part1.dummyd[2]*part2.dummyd[2])/mypow(distance, 3);
ret -= 9.*abstand(part1.dummyd)*abstand(part2.dummyd)/mypow(distance, 3) * (part1.dummyd[2]/abstand(part1.dummyd) * part2.dummyd[2]/abstand(part2.dummyd));
return ret;
}
}
對於任何誰在乎,它的一個偶極相互作用的力項(耶,物理!)。
- 粒子是我的結構,只是將變量保持在一起。
- dummyd是[3] - 陣列是偶極矩,其成分範圍從大約-5至5,在最大
- abstand()是向量範數,從數學上講,和abstand(dummyd)之間是從2.4到5.6
- MYPOW()0.6和2.5
- 距離範圍僅僅是出於性能 定製POW()
- 的3和9是用於數字XP
- 所有變量都是長雙
此外,如果我註釋掉函數的第一項(long double ret
以下的行),它似乎停止了NaN'ing,而第二項(此後的行,更長的行)似乎工作。
上面的函數是整個算法的一部分,它總共迭代了幾百萬次;沿着線的某處,位置和動量數組(使用這個函數)的輸出開始只得到NaN並且從那裏保持。實際上對輸出進行過濾是相當多的工作,但到目前爲止,它似乎是從正常值(即在預期的範圍內,遠不及大數字)那裏得到的。
現在,我想明白爲什麼我會在這種情況下得到NaN,以及如何解決它。任何能向我解釋的人都會獲得+10的超讚。
很好的回答。如果OP仍然有問題,那麼使用'if'語句來檢查結果應該使您能夠打印麻煩的輸入,並在必要時放置一個斷點來調用調試器。 –
+1。我正忙於檢查數學,我沒想過要檢查代碼! – parrowdice
@ user2995421出於好奇:您的編譯器沒有警告您「控制達到非void函數的結束」,還是您忽略了警告? – Hulk