【问题标题】:What's the maximum absolute error for floating-point comparisons?浮点比较的最大绝对误差是多少?
【发布时间】:2016-04-08 04:31:16
【问题描述】:

我想像这样比较浮点数:

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

【问题讨论】:

标签: objective-c c floating-point precision


【解决方案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 中针对您使用的格式进行类似的计算。它太大而无法用于合理的幅度计算。

您确实需要处理相对误差,无论是明确地还是通过选择适合您的数字大小的固定界限。

【讨论】:

  • 谢谢。关于您关于相对错误的观点,对于我的用例(对 UI 布局的测试)来说,断言一个视图从前一个视图结束的位置开始是过分的。我认为我编写的代码几乎都不需要这种级别的精度。例如,我不是在控制火箭的轨迹。
  • @KartickVaddadi 对于 UI 布局,您的大多数数字将彼此相差几个数量级。在这种情况下,我会选择一个适用于这些数字的固定 epsilon。如果你改用天体物理学,你将无法使用相同的 epsilon。
猜你喜欢
  • 2020-10-31
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多