看板 Fortran 關於我們 聯絡資訊
※ 引述《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 ) ) 少掉速度慢的開根號、次方運算 且避掉浮點數誤差累積的部分 數學上等價,但是在運算中的精確度與速度會有明顯差異 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.87.154.227 ※ 文章網址: https://www.ptt.cc/bbs/Fortran/M.1439434296.A.7ED.html
boa85391: 感謝指教!! 可是我不是很懂說為何可以避免誤差累積 08/13 12:22
boa85391: 是減號的那個欄位精簡後避免喪失精確位數嗎? 08/13 12:24
ededws1: 原來根號跟次方會比較慢 08/14 21:59