小编Mat*_*ock的帖子

具有模数的while循环中的浮点比较

我想建议如何优化以下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(绘制四分之一英里的增量).

提前致谢.

c++ floating-point loops modulus

3
推荐指数
1
解决办法
1102
查看次数

float fmodf(float_x,float_y)函数,math.h,c ++

你好,我希望有人可以帮助我.

我正在使用math.h中的float fmodf(float_x,float_y)函数.

我能够正确编码,但我只是想知道有没有人知道函数的确切代码是什么,所以我可以更好地理解它

c++ floating-point math.h modulus fmodf

2
推荐指数
1
解决办法
861
查看次数

如何使用fmod并避免精度问题

我将把这个问题归结为最简单的形式:

让我们以0.05的步长从[0 .. 5.0]迭代,并为每0.25乘法器打印出'X'.

for(double d=0.0; d<=5.0; d+=0.05) {
  if(fmod(d,0.25) is equal 0)
    print 'X';
}
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为d[0,0.0500000000001,0.100000000002,...]导致fmod()失败.极端的例子是什么时候d=1.999999999998fmod(d,0.25) = 1.

如何解决这个问题?这是一个可编辑的在线示例.

c precision double-precision modulus

1
推荐指数
1
解决办法
356
查看次数

标签 统计

modulus ×3

c++ ×2

floating-point ×2

c ×1

double-precision ×1

fmodf ×1

loops ×1

math.h ×1

precision ×1