浮点比较的最大绝对误差是多少?

时间:2016-04-08 04:31:17

标签: objective-c c floating-point precision

我想比较像这样的花车:

void assertEquals(CGFloat f, CGFloat g) {
  NSCAssert(fabs(f-g) < 0.1);
}

void assertLE(CGFloat f, CGFloat g) {
  NSCAssert(f <= g + 0.1);
}

我可以使用比0.1更严格的约束吗?浮点比较可以有多大的最大误差?有没有宏,所以我不对数字进行硬编码?

1 个答案:

答案 0 :(得分:4)

IEEE 754 32位二进制浮点计算中的最大舍入误差约为1e31。我使用这个程序在Java中计算它:

public class Test {
  public static void main(String[] args) {
    float biggest = Float.MAX_VALUE;
    float nextBiggest = Math.nextDown(biggest);
    float gap = biggest - nextBiggest;
    System.out.println(gap / 2);
  }
}

它是两个最大有限数之间的距离的一半。您可以在Objective-C中针对您使用的格式执行类似的计算。用于合理的量级计算将太大。

您确实需要明确地处理相对错误,或者选择适合您数字大小的固定界限。