浮点比较的最大绝对误差是多少?
What's the maximum absolute error for floating-point comparisons?
我想这样比较浮点数:
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 中为您使用的格式进行类似的计算。它将太大而无法用于合理的震级计算。
您确实需要处理相对误差,无论是显式还是通过选择适合您的数字大小的固定界限。
我想这样比较浮点数:
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 中为您使用的格式进行类似的计算。它将太大而无法用于合理的震级计算。
您确实需要处理相对误差,无论是显式还是通过选择适合您的数字大小的固定界限。