0

我什至不确定我是在问一个问题,这次我找到了一种“迂回”的方式,但是……我花了几天时间才意识到这是问题所在,而且……好吧,其他时候我可能不会能够绕过它......还有其他人来过这个吗?比较实际上相等的双精度类型变量时,结果是“>”...

 printf("compare: %ld ?? %ld\n", (double)( radii(nowX,nowY)*irange2 ),(double)(Rad2*irange2)); getchar();
 if( (double)(radii(nowX,nowY)*irange2)<(double)(Rad2*irange2) ) printf("*** < ***\n"); 
 if( (double)(radii(nowX,nowY)*irange2)>(double)(Rad2*irange2) ) printf("*** > ***\n");
 if( (double)(radii(nowX,nowY)*irange2)==(double)(Rad2*irange2) ) printf("*** == ***\n")
 printf("SECOND = %d\n", ((double)(radii(nowX,nowY)*irange2))<= ( (double)(Rad2*irange2)

输出:

compare: 1509949.440000 ?? 1509949.440000
*** > ***
SECOND = 0

 printf("compare: %ld ?? %ld\n", (long)( radii(nowX,nowY)*irange2 ), (long)(Rad2*irange2)); getchar();
 if( (long)(radii(nowX,nowY)*irange2)<(long)(Rad2*irange2) ) printf("*** < ***\n");
 if( (long)(radii(nowX,nowY)*irange2)>(long)(Rad2*irange2) ) printf("*** > ***\n"); 
 if( (long)(radii(nowX,nowY)*irange2)==(long)(Rad2*irange2) ) printf("*** == ***\n")
 printf("SECOND = %d\n",  ((long)(radii(nowX,nowY)*irange2))<= ( (long)(Rad2*irange2) ) ); getchar();

输出:

compare: 1509949 ?? 1509949

*** == ***
SECOND = 1
4

2 回答 2

2

这里的问题是浮点运算用于进行近似运算,因此它得到的结果有各种错误,并且您没有显示数字的完整值。

当完全显示时,数字看起来不相等。

比较平等不是这里的有罪操作。当输入不正确时,几乎所有函数都无法给出正确的结果。例如,如果您计算一个值的平方根,如果计算准确,则该值将为零或正,但由于先前的舍入误差而略微为负,那么您将获得取负数平方根的异常。

在舍入近似结果、减去近似结果(以增加相对误差的幅度而臭名昭著)和其他函数时,也会出现类似的问题。所有带有浮点的运算,而不仅仅是比较相等性,都应该考虑到结果是近似的事实(除非设计得非常仔细)。

于 2013-01-15T13:13:49.337 回答
1

发生这种情况是因为,根据计算,双精度值可能会略有不同。因此不建议检查是否相等。相反,检查两个双打是否非常接近。另请参阅此链接以获取说明。

编辑:只是为了澄清这一点:对于所有浮点类型都是如此,因为这是它们存储方式所固有的。

于 2013-01-15T08:34:04.027 回答