尽管有浮点运算,但是从fmod或类似的方法实现了预期的结果

时间:2012-06-19 10:39:51

标签: c++ floating-accuracy fmod

背景

考虑验证三个双打lowwidthhigh,以便以下三个规则成立:

  1. low < high;
  2. width > 0;和
  3. width完全符合“(high - low)”的次数。
  4. 基本上,这三个值应该指定一个范围,该范围将被分割成一定数量的箱子,每个箱子的“完全”相等的宽度,没有任何部分范围未被计算。

    例如:

    (A) low = -0.5width = 0.005high = 0.5

    会指定一个有效 bin宽度的范围,因为可以创建“完全”200个完整的bin,而

    (B) low = -0.5width = 0.275high = 0.5

    会指定一个带有无效 bin宽度的范围,因为可以创建3个完整的bin,但这些bin的部分范围不会被覆盖。

    问题

    考虑到双精度浮点性质,处理第三个验证规则的最佳方法是什么?

    我的第一次天真尝试包括:

    fmod( high - low, width ) == 0.0

    但遗憾的是fmod返回0.005,例如(A) - 我的调试器告诉我,0.005的两倍实际上保持0.0050000000000000001的值。

    我应该回家制作我自己的解决方案以包含公差,还是有更优雅的解决方案解决这个问题?

    这就是我目前的情况:

    bool valid(double range, double width, double tolerance = 0.000000001)
    {
      assert(width > 0 && range > 0);
    
      while( range > 0 && range > tolerance )
      {
        range -= width;
      }
    
      return abs(range) <= tolerance;
    }
    

    请注意公差的默认值的完全和完全随意性......

1 个答案:

答案 0 :(得分:1)

使用容差进行双重比较的方法是合理的。您现在唯一需要的是进行剩余的需求分析,以确定您真正需要多么精确:)

如果您知道最大精度,则乘以最大值进行比较。

相关问题