ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 带模数的while循环中的浮点比较

2019-08-26 21:17:51  阅读:217  来源: 互联网

标签:modulus c loops floating-point


我想建议如何优化以下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");

本质上,我在循环中递增一个计数器的次要间隔,并且如果我处于一个主要的间隔,我想知道每次循环.想象这是用毫米间隔画一个尺子,每当我到达一个主要的间隔时,我想画一厘米.鉴于浮点运算的不准确性,如何修改上述循环以实现我需要的功能?我尝试过使用公差比较模数结果的不同方法,但没有运气.注意,次要和主要间隔可以是任何值,即次要= 0.4和主要= 1.6(以绘制四分之一英里的增量).

提前致谢.

解决方法:

我将使用for循环遍历int变量i来实现它.由于浮点运算的限制,使用整数避免了舍入问题. [见What Every Computer Scientist Should Know About Floating-Point Arithmetic.]

让我从0运行到iFinish-1并设置时间等于start i * minor_interval.可以通过将(finish-start)/ minor_interval舍入到最近的int来找到iFinish的值.

可以以类似的方式处理主轴更新.将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);
    ...
}

标签:modulus,c,loops,floating-point
来源: https://codeday.me/bug/20190826/1733907.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有