背景
考虑验证三个双打low
,width
和high
,以便以下三个规则成立:
low < high
; width > 0
;和width
完全符合“(high - low)
”的次数。基本上,这三个值应该指定一个范围,该范围将被分割成一定数量的箱子,每个箱子的“完全”相等的宽度,没有任何部分范围未被计算。
例如:
(A) low = -0.5
,width = 0.005
和high = 0.5
会指定一个有效 bin宽度的范围,因为可以创建“完全”200个完整的bin,而
(B) low = -0.5
,width = 0.275
和high = 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;
}
请注意公差的默认值的完全和完全随意性......
答案 0 :(得分:1)
使用容差进行双重比较的方法是合理的。您现在唯一需要的是进行剩余的需求分析,以确定您真正需要多么精确:)
如果您知道最大精度,则乘以最大值进行比较。