提问人:Bojan Hrnkas 提问时间:11/14/2023 最后编辑:CliffordBojan Hrnkas 更新时间:11/14/2023 访问量:63
浮点问题,减法后选择 epsilon [已关闭]
Floating Point problem, choose epsilon after subtraction [closed]
问:
浮点不准确存在一个已知问题。(如何为浮点选择epsilon值?)
这在大多数情况下都有效。但是,如果一个变量首先包含一个高数字,即 10000,然后在循环中通过减去 300 到 800 之间的数字而变小,直到它达到零,则结果值 (~0) 具有浮点误差,该误差位于第一个值 (10.000) 的刻度上,因此在使用上述链接中提供的解决方案进行比较时,它不够接近零。
是否有已知的标准解决方案来解决此问题?
我已经研究了定点算术,但我想在沿着这条路走下去之前尝试使用浮点来解决它。
编辑:(伪代码来说明问题)
double value = 10000; //is actually something like 10000.00000000004
for(int i = 0; i < 20; i++) {
value -= 500;
}
bool isZero = is_approximately_equal(value, 0.0);
isZero 为 false,因为 epsilon 被调整为两个操作数的比例,并且小于值为 ~ 10000 时引入的误差。
is_approximately_equal的定义:
bool is_approximately_equal(double a, double b) {
double scale = max(abs(a), abs(b));
return abs(a - b) <= scale * (2*epsilon);
}
有关该问题的更多信息:浮点数学是否损坏?
答: 暂无答案
评论