Re: [問題] 迴圈拆開計算後與原本值有微小誤差

作者: latinboy (阿賢)   2015-08-13 10:51:31
※ 引述《boa85391 ( )》之銘言:
: rpq= dsqrt(rx**2+ry**2+rz**2)
: if (rpq<=r_c) then
: if (bead(i)%bead_number==1 .and. bead(j)%bead_number==1) then
: rep_term=dabs(24.d0*eps_hh*(2.d0*sigma**12*rpq**(-14)&
: -sigma**6*rpq**(-8)))
上述浮點數的運算為了避免誤差累積以及增加效率
可以改成
r2 = 1.d0 / (rx*rx + ry*ry + rz*rz)
r6 = r2 * r2 * r2
a2 = sigma * sigma
a6 = a2 * a2 * a2
ar6 = a6 * r6
rep_term = dabs( 24.d0 * eps_hh * ar6 * r2 * ( 2 * ar6 - 1.d0 ) )
少掉速度慢的開根號、次方運算
且避掉浮點數誤差累積的部分
數學上等價,但是在運算中的精確度與速度會有明顯差異
作者: boa85391 ( )   2015-08-13 12:22:00
感謝指教!! 可是我不是很懂說為何可以避免誤差累積是減號的那個欄位精簡後避免喪失精確位數嗎?
作者: ededws1 (ATMJin)   2015-08-14 21:59:00
原來根號跟次方會比較慢

Links booklink

Contact Us: admin [ a t ] ucptt.com