java - 哦,不,不再 - 比较两碗矮牵牛 - 对不起 - 浮动,平等
问题描述
由于舍入误差,大多数浮点数最终都会稍微不精确。
https://www.floating-point-gui.de/errors/comparison/
public static boolean nearlyEqual(float a, float b, float epsilon) {
final float absA = Math.abs(a);
final float absB = Math.abs(b);
final float diff = Math.abs(a - b);
if (a == b) { // shortcut, handles infinities
return true;
} else if (a == 0 || b == 0 || diff < Float.MIN_NORMAL) {
// a or b is zero or both are extremely close to it
// relative error is less meaningful here
return diff < (epsilon * Float.MIN_NORMAL);
} else { // use relative error
return diff / Math.min((absA + absB), Float.MAX_VALUE) < epsilon;
}
}
的通用标准值是什么epsilon
,例如,如果我想将它硬编码为一个任何人都可以用来比较任何值的 API?
解决方案
epsilon 没有通用标准,因为它在很大程度上取决于您要比较的内容和目的。每次测试两个浮点数是否接近相等时,都需要考虑两件事:
- 这些数字的绝对值
- 它们代表的数量类型
例如,众所周知,PI 为“3.14 左右”,这对于大多数工程应用来说已经足够了,但在数学或光谱分析(天文学)中,您需要更高的精度。
即使使用相同的域,您比较的数字的绝对值也会影响您对 epsilon 的选择。将地球的周长(以千米为单位)40_000.00
与到月球的距离(以米为单位)进行比较,以384_400_000.00
获得完全不同的误差容限。
推荐阅读
- android - 如何绕过安装向导,在 Powershell 脚本中直接启动 Android Studio 的便携式安装?
- flutter - 如何使用新未来的结果更新 FutureBuilder 小部件?
- php - 调用未定义的方法 Illuminate\Database\Query\Builder::fireCustomModelEvent()
- postgis - 如何按最近点查询postgis数据并只返回该点的结果?
- c# - 如何使用 SQl、EF 和 linQ 从 C# 模型中获取数据
- python-3.x - python - 如何使用python在pandas数据框中的第一个连续重复值后删除?
- reactjs - 如何使用 redux 和 redux-thunk 将获取的数据从服务器保存到组件状态?
- c# - 如何定义一个自定义标签来过滤基于类型的每个列表
- python - 来自自定义 ansible 模块的调试信息
- mysql - 选择另一列而不是与 GROUP BY 一起使用