众所周知,由于舍入和精度问题,比较浮点数是否相等.
例如:https: //randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
在Python中处理这个问题的推荐方法是什么?
当然,这个地方有一个标准的库函数吗?
我发现了一个有趣的案例,相同的C++代码在不同的系统上产生不同的结果.
#include <cstdio>
int main()
{
int a=20, b=14;
if(a*1.0/b*(a+1)/(b+1)==2) printf("YES!");
else printf("NO!");
}
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.6.3在Ubuntu Linux 12.04上编译,输出YES!
使用GCC 4.6.2在Windows 7上编译,输出NO!
但是,使用:
double c = a*1.0/b*(a+1)/(b+1);
if (c==2) printf("YES!");
...
Run Code Online (Sandbox Code Playgroud)
将返回YES!在两台机器上.
有什么想法出现这种差异?这是由编译器版本不匹配引起的(路径级版本号应该不重要)?为什么它实际输出NO!在Windows机器上,这种情况显然是真的吗?
在下面的代码中,如果x0 == x1和y0 == y1,那么它应该告诉我.在我正在使用的例子中,它们是.但是,Python只是说x值相等,而不是y.
这是代码:
print "arc2x0 = ", arc2x0, ", arc2x1 = ", arc2x1
print "arc2y0 = ", arc2y0, ", arc2y1 = ", arc2y1
if arc2x0 == arc2x1:
print "x0 == x1"
else:
print "x0 != x1"
if arc2y0 == arc2y1:
print "y0 == y1"
else:
print "y0 != y1"
Run Code Online (Sandbox Code Playgroud)
这是输出:
arc2x0 = 5 , arc2x1 = 5.0
arc2y0 = -4.16026900507 , arc2y1 = -4.16026900507
x0 == x1
y0 != y1
Run Code Online (Sandbox Code Playgroud)
知道为什么y值测试相同吗?这些值以相同的方式计算.也许除了我所看到的不平等之外还有更多的精确度?有关如何调试此精度或任何其他想法的任何方法?