【发布时间】:2015-07-30 11:55:27
【问题描述】:
我经常需要编码explicit schemes,这意味着我必须通过增加时间变量t <- t+ dt 来查看函数的演变。因此,我的循环在dt 上增加是很自然的:
int N = 7;
double t=0., T = 1., dt=T/N; // or I could have dt=0.03 for example
for(; t<T; t+= dt){
if(T - t < dt){
dt = T-t;
}
//some functions that use dt, t, T etc
}
这背后的基本原理是,我在每一步都将t 增加一个常量dt,除非在最后一次迭代中,如果我当前的时间t 是这样的T- dt < t < T,那么我修改我的时间增量dt <- T-t。
这种程序可能存在哪些缺陷或我可以改进它的方法是什么?我确实意识到我可能会得到一个非常小的时间增量。
是否会出现任何浮动问题(我是否应该坚持整数递增)?
在优化方面,我认为这种技术并不昂贵,因为基本的分支预测几乎总是会跳过 if 块。
编辑
我意识到我的问题不是很好。通常dt 由CFL condition 给出,也就是说,它与其他一些参数相比足够小。
所以从逻辑上看,dt是先给定的,然后我们可以定义一个整数N=floor(T/dt),用整数循环到N,然后处理剩余的时间间隔N*dt --- T。
代码是:
double dt = //given by some function;
double t=0., T = 1.;
for(; t<T; t+= dt){
if(T - t < dt){
dt = T-t;
}
//some functions that use dt, t, T etc
}
【问题讨论】:
-
双重和浮动比较并不容易。看看this
-
@LeFlou 我认为这个问题试图确定两个双打何时相等或有点相等。就我而言,我只是确定哪个更大。确实,我认为在操作
dt=T-t;和t += dt之后,t < T是错误的。 -
如果
T-t非常小,在舍入误差范围内,您可能希望跳过最后一次迭代。它可能不会很有意义。
标签: c++ for-loop floating-point