我想比较一下这样的浮动:

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更严格的限制吗?浮点比较的最大误差是什么?有宏吗,这样我就不用硬编码了?

最佳答案

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中对所使用的格式进行类似的计算。它太大了,无法用于合理的震级计算。
你确实需要处理相对误差,要么显式地,要么选择一个适合你的数字大小的固定界限。

10-02 09:25