首页 > 解决方案 > 哦,不,不再 - 比较两碗矮牵牛 - 对不起 - 浮动,平等

问题描述

由于舍入误差,大多数浮点数最终都会稍微不精确。

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?

标签: java

解决方案


epsilon 没有通用标准,因为它在很大程度上取决于您要比较的内容和目的。每次测试两个浮点数是否接近相等时,都需要考虑两件事:

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

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

即使使用相同的域,您比较的数字的绝对值也会影响您对 epsilon 的选择。将地球的周长(以千米为单位)40_000.00与到月球的距离(以米为单位)进行比较,以384_400_000.00获得完全不同的误差容限。


推荐阅读