PCL*_*PCL 3 c++ floating-point loops modulus
我想建议如何优化以下while循环:
double minor_interval = 0.1;
double major_interval = 1.0;
double start = 0.0;
double finish = 10.0;
printf("Start\r\n");
while (start < finish)
{
printf("Minor interval: %.20f\r\n", start);
double m = fmod(start, major_interval);
printf("m: %.20f\r\n", m);
if (m == 0)
printf("At major interval: %.20f\r\n", start);
start += minor_interval;
}
printf("Finished\r\n");
Run Code Online (Sandbox Code Playgroud)
本质上,我在循环中递增一个计数器的次要间隔,并且如果我处于一个主要的间隔,我想知道每次循环.想象这是用毫米间隔画一个尺子,每当我到达一个主要的间隔时,我想画一厘米.鉴于浮点运算的不准确性,如何修改上述循环以实现我需要的功能?我尝试过使用公差比较模数结果的不同方法,但没有运气.请注意,次要和主要间隔可以是任何值,即minor = 0.4和major = 1.6(绘制四分之一英里的增量).
提前致谢.
我将通过int变量的for循环实现它i.由于浮点运算的限制,使用整数避免了舍入问题.[参见每个计算机科学家应该知道的关于浮点运算的内容.]
让我们i从运行0到iFinish-1并设置time等于start + i*minor_interval.iFinish可以通过舍入(finish-start)/minor_interval到最近的int 找到值.
可以以类似的方式处理主轴更新.圆major_interval/minor_interval到最近的int,说k.然后每第k次迭代更新主轴标记.
在代码方面,它看起来像这样:
double round(double r) {
return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
...
int iFinish = round((finish-start)/minor_interval);
int k = round(major_interval/minor_interval);
for (int i=0; i<iFinish; i++)
{
double time = start + i*minor_interval;
bool isMajor = (i%k == 0);
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |