2013-11-15 72 views
0

我正在編寫一個項目工作,我的最新問題是輸出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的超讚。

回答

5

if條件失敗時,您不需要return任何東西。如果使用「返回」值,這將導致未定義的行爲。

+0

很好的回答。如果OP仍然有問題,那麼使用'if'語句來檢查結果應該使您能夠打印麻煩的輸入,並在必要時放置一個斷點來調用調試器。 –

+0

+1。我正忙於檢查數學,我沒想過要檢查代碼! – parrowdice

+0

@ user2995421出於好奇:您的編譯器沒有警告您「控制達到非void函數的結束」,還是您忽略了警告? – Hulk

2

沒有返回值是一種可能性,但當distance爲0時mypow()會做什麼?

0到3 = 0,所以你也有除以零(除非mypow()處理)。

嘗試:

long double force_dipol(particle &part1, particle &part2, long double distance) 
{ 
    long double ret = 0; 
    if ((abstand(part1.dummyd)!=0) && (abstand(part2.dummyd)!=0) && (distance!=0)) //Division checks 
    { 
    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; 
} 
+0

不,mypow()不處理任何東西,但距離也不能爲0。事實上,我正在養成檢查我劃分的所有事情的習慣,但這裏並不需要。爲了好的措施,我複製了代碼並嘗試了,但問題依然存在。 – user2995421

+0

@ user2995421:「我養成了檢查我除以分隔的所有事情的習慣,但在這裏它確實沒有必要」 - 這從來都不是真實的:O,特別是在沒有檢查/ zero的孤立函數中。如果'mypow'的實現發生更改,則會在代碼的其他部分留下潛在的崩潰。最佳做法是使用防禦性編程。 – parrowdice