我想比较像这样的花车:
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更严格的约束吗?浮点比较可以有多大的最大误差?有没有宏,所以我不对数字进行硬编码?
答案 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中针对您使用的格式执行类似的计算。用于合理的量级计算将太大。
您确实需要明确地处理相对错误,或者选择适合您数字大小的固定界限。