作者latinboy (阿贤)
看板Fortran
标题Re: [问题] 回圈拆开计算後与原本值有微小误差
时间Thu Aug 13 10:51:31 2015
※ 引述《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://webptt.com/cn.aspx?n=bbs/Fortran/M.1439434296.A.7ED.html
1F:推 boa85391: 感谢指教!! 可是我不是很懂说为何可以避免误差累积 08/13 12:22
2F:→ boa85391: 是减号的那个栏位精简後避免丧失精确位数吗? 08/13 12:24
3F:推 ededws1: 原来根号跟次方会比较慢 08/14 21:59