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