如何使用FMOD,避免精度问题(How to use fmod and avoid precisio

2019-10-22 02:30发布

我要熬这个问题降低到最简单的形式:

让我们从[0 .. 5.0]进行迭代以0.05的步骤,并打印出“X”为每0.25乘数。

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

当然,这是不行的,因为d将[0,0.05000000001,0.100000000002 ...]造成FMOD()失败。 极端的例子是当d=1.999999999998fmod(d,0.25) = 1

如何解决呢? 这里是一个编辑的在线例子。

Answer 1:

我会简单地以这种方式不使用浮点变量解决这个问题:

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';
}

他们通常是有问题的,以至于它值得一点点额外的努力避免他们。



Answer 2:

在你总是有相同的固定小数的情况下,简单地乘以你的循环计数器(20在这种情况下)。 当您想通过20来访问它作为一个双,鸿沟实际上,您使用的是隐藏的指数,让您的双整数。

在该示例中,我使用的整数为一个循环计数器,假设它具有所要求的精度。

for(int i=0; i<=100; i+=1) {
  if(i % 5 == 0)
    print 'X';
  double d = (double)i / 20.0;
  // use d
}


文章来源: How to use fmod and avoid precision issues