我想反复增加我的变量time
,并确保它与所有精确匹配的值是align_time
.
目前我有一个功能
subroutine align(time, incr, align_time)
real(8) time, incr, align_time
if (modulo(time+incr,align_time) .lt. modulo(time,align_time)) then
incr = align_time - modulo(time,align_time)
end if
time = time + incr
end subroutine
这可以称为
time = 0
align_time = 100
do while (time < 10000)
incr = cpt_incr(...)
call align(time, incr, align_time)
...
end do
问题是由于舍入错误,程序在某些时候挂起。说align_time
是 0.1 在这一点time
上等于 0.6-eps(eps 是机器 epsilon),当它应该是 0.6 时,则incr
始终设置为 0。
我还应该提到,align_time
在某些时候可能会发生变化,比如if (time > 1000) align_time = 200
.
有人知道如何以避免舍入错误的方式解决问题吗?
[我真的对标签和标题没有任何好的想法,如果有,请编辑。此外,不想添加 Fortran,因为这同样适用于 C 或其他]
编辑:incr
必须减小的值才能实现对齐,而不是增加。align_time
可以比值大 100 倍,incr
但也可以更小。incr
不是恒定的。