java - 哦,不,不再 - 比较两碗矮牵牛 - 对不起 - 漂浮,为了平等

标签 java

Due to rounding errors, most floating-point numbers end up being slightly imprecise.

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 没有通用标准,因为它很大程度上取决于您要比较的内容和目的。每次测试两个 float 是否接近相等时,您需要考虑两件事:

  • 这些数字的绝对值
  • 它们代表的数量类型

例如,众所周知,PI 为“3.14 左右”,这对于大多数工程应用来说已经足够好了,但在数学或光谱分析(天文学)中,您需要更高的精度。

即使在同一域中,您比较的数字的绝对值也会影响您对 epsilon 的选择。比较以公里为单位的地球周长与 40_000.00 与以米为单位的月球距离与 384_400_000.00 的误差容忍度完全不同。

关于java - 哦,不,不再 - 比较两碗矮牵牛 - 对不起 - 漂浮,为了平等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449095/

相关文章:

java - 尝试将 Dart 程序转换为 Java

java - Spring security saml 中的代理设置

java - 重构switch代码中的公共(public)代码

java - 下载zip文件后如何提示 "open with"菜单

java - 如何使用java在mssql中插入列

Java Setters 在 Array 对象上没有按预期工作

处理 Alpha 时的 Java DirectColorModel 与 IndexColorModel

java - 为什么我们不应该在用户消息中提供用户提供的数据?可能存在任何威胁/攻击吗?

java - 小部件比它应该占据更多的地方

java - 单元测试来测试Linux特定代码