C++ 双变量as循环计数器
我经常需要编码,这意味着我必须首先通过增加时间变量C++ 双变量as循环计数器,c++,for-loop,floating-point,C++,For Loop,Floating Point,我经常需要编码,这意味着我必须首先通过增加时间变量t来观察函数的演化,如果不需要(t-t
t来观察函数的演化,如果不需要(t-t
,则补偿,因为它的唯一目的似乎是将最后一个值设置为t==t
,由于不平等性,它不会被处理。。。;t在for循环条件中
这就是说,除非N
是二的幂,否则有限差分法对浮点运算不太有效。例如,如果希望以0.1f的步长计算函数,则很可能会错过几个积分点
分支预测可能会跳过条件评估,但在混合浮点操作和流控制操作时也可能会受到惩罚/延迟
由于舍入误差的累积,优化器可能无法轻松确定迭代计数,因此不允许进行某些优化(循环展开,甚至向量化)
可以简单地通过线性插值来减小误差:t=c*dt
,但不是完美的,因为并非所有情况下都是(dbl/N)*N==dbl
。实际上,误差应为ε量级。要得到精确的结束值,必须计算t=(range*N)/N
这一次确保range*N
不会降低最低有效位。首先,如果不需要(t-t
补偿,因为它的唯一目的似乎是将最后一个值设置为t==t
,由于不平等性,这将不会被处理。。。;t在for循环条件中
这就是说,除非N
是二的幂,否则有限差分法对浮点运算不太有效。例如,如果希望以0.1f的步长计算函数,则很可能会错过几个积分点
分支预测可能会跳过条件评估,但在混合浮点操作和流控制操作时也可能会受到惩罚/延迟
由于舍入误差的累积,优化器可能无法轻松确定迭代计数,因此不允许进行某些优化(循环展开,甚至向量化)
可以简单地通过线性插值来减小误差:t=c*dt
,但不是完美的,因为并非所有情况下都是(dbl/N)*N==dbl
。实际上,误差应为ε量级。要得到精确的结束值,必须计算t=(range*N)/N
这一次确保范围*N
不会丢失最低有效位。使用新信息,必须将dt
设置为固定的预定值
(至少对于除最后一步以外的所有步骤),我的建议如下:
double T0 = 0.0;
double T = 1.0;
int N = floor((T - T0)/dt);
double t = T0;
for (int step_number = 0; step_number < N; ++step_number, t += dt)
{
t = T0 + step_number * dt;
do_one_step(t, T, dt);
}
if (t < T)
{
do_one_step(t, T, T - t);
}
(请注意,这表示dt=(T-T)/N
,以防您决定以T
的非零值开始迭代)
或者,如果N
非常大,则可能会稍微更精确
(因为t+=dt
一旦t
变大,就必须有效地对dt
进行四舍五入):
int N=7;
双T=1.0;
双dt=T/N;
对于(整数步数=0;步数
带有新信息,即必须将dt
设置为固定的预定值
(至少对于除最后一步以外的所有步骤),我的建议如下:
double T0 = 0.0;
double T = 1.0;
int N = floor((T - T0)/dt);
double t = T0;
for (int step_number = 0; step_number < N; ++step_number, t += dt)
{
t = T0 + step_number * dt;
do_one_step(t, T, dt);
}
if (t < T)
{
do_one_step(t, T, T - t);
}
(请注意,这表示dt=(T-T)/N
,以防您决定以T
的非零值开始迭代)
或者,如果N
非常大,则可能会稍微更精确
(因为t+=dt
一旦t
变大,就必须有效地对dt
进行四舍五入):
int N=7;
双T=1.0;
双dt=T/N;
对于(整数步数=0;步数
Double和floating比较并不容易。看看@LeFlou,我认为这个问题试图确定两个双打是相等还是有点相等。在我的例子中,我只是决定哪一个更大。确实,我认为在操作之后,dt=T-T
和t+=dt
则t
为假。如果t-t
在舍入误差范围内非常小,则可能需要跳过上一次迭代。这可能不是很有意义。双重比较和浮动比较并不那么容易。看看@LeFlou,我认为这个问题试图确定两个双打是相等还是有点相等。在我的例子中,我只是决定哪一个更大。确实,我认为在操作之后,dt=T-T
和t+=dt
则t
为假。如果t-t
在舍入误差范围内非常小,则可能需要跳过上一次迭代。这可能没有什么意义。我道歉。我不知道我在想什么,但首先定义dt
,然后我们可以得出N
,这一事实在这种情况下很重要。首先我们想到一个dt
,然后我们得到足够的迭代次数。我一开始就让我们看起来像是被赋予了N
,但事实并非如此。再次抱歉。循环中的t+=dt
看起来像一个工件:P。您还提到它必须四舍五入。你能解释一下那句话吗?在什么情况下会发生这种情况?我的推理是:如果说t
的顺序是1,而dt
的顺序是1e-10
,那么在dt
中仍然会留下大约5个有效数字。这也意味着我们正在执行大约10^10次迭代,这是一个非常重要的数字,比wh大
double T0 = 0.0;
double T = 1.0;
int N = floor((T - T0)/dt);
double t = T0;
for (int step_number = 0; step_number < N; ++step_number, t += dt)
{
t = T0 + step_number * dt;
do_one_step(t, T, dt);
}
if (t < T)
{
do_one_step(t, T, T - t);
}
int N = 7;
double t = 0.0;
double T = 1.0;
double dt = (T - t)/N;
for (int step_number = 0; step_number < N; ++step_number, t += dt)
{
// ... calculations with t, T, dt, etc.
}
int N = 7;
double T = 1.0;
double dt = T/N;
for (int step_number = 0; step_number < N; ++step_number)
{
double t = T0 + step_number * dt;
// ... calculations with t, T, dt, etc.
}