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

看板Fortran作者 (阿賢)時間9年前 (2015/08/13 10:51), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

08/13 12:22, , 1F
感謝指教!! 可是我不是很懂說為何可以避免誤差累積
08/13 12:22, 1F

08/13 12:24, , 2F
是減號的那個欄位精簡後避免喪失精確位數嗎?
08/13 12:24, 2F

08/14 21:59, , 3F
原來根號跟次方會比較慢
08/14 21:59, 3F
文章代碼(AID): #1Lp0OuVj (Fortran)
文章代碼(AID): #1Lp0OuVj (Fortran)