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

Pri*_*alj 1 c precision double-precision modulus

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

让我们以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.

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

pax*_*blo 6

我只是不以这种方式使用浮点变量来解决这个问题:

for (int i = 0; i <= 500; i += 5) {
  double d = i / 100.0;  // in case you need to use it.
  if ((i % 25) == 0)
    print 'X';
}
Run Code Online (Sandbox Code Playgroud)

它们通常存在问题,因此在避免它们方面需要额外的努力.