当使用比较运算符比较具有相同值的整数和浮点变量时会发生什么?
main( )
{
int x = 3 ;
float y = 3.0 ;
if ( x == y )
printf ( "nx and y are equal" ) ;
else
printf ( "nx and y are not equal" ) ;
}
output : x and y are equal
What happens when x is compared with y variable?
int
隐式转换为float
类型;您的代码等效于
if ((float)x == y)
请注意,即使从int
到float
的转换失去精度(在您的情况下不会(,也会发生这种情况。
一个好的一般规则是,你永远不应该比较浮点数的精确相等性。 著名的,看起来简单的代码片段,如
float f1 = 1.1, f2 = 2.2;
float f3 = 3.3;
if(f1 + f2 == f3) printf("expectedn");
else printf("surprisen");
很可能表现得令人惊讶。 原因是大多数实数(包括像1.1
这样的普通小数(不能用有限宽度浮点表示精确地表示。
当然,有些数字可以准确地表示。 特别是,即使在低精度浮点表示中,通常也可以精确地表示小整数。 因此,要重述您的示例,请编写类似
int x = 3;
float y = 3.0;
if(x == y) printf("expectedn");
else printf("surprisen");
几乎可以保证在任何实用的计算机上打印预期的结果。
它究竟是如何工作的? C 支持混合模式算法。 你完全可以写x == y
这样的东西,即使x
和y
有不同的类型。 通常发生的情况是编译器将隐式转换插入到通用类型。 所以当你写x == y
时,编译器对自己说。 "嗯。 我没有比较 int 和浮点数相等的说明。 但是,如果我将 int 转换为浮点数,我将有两个浮点数,然后我可以使用机器的单精度浮点相等比较运算符。 所以我会假装表情是(float)x == y
的。
但一般规则仍然有效。 浮点变量可以精确地存储像3.0
这样的小整数(或像0.5
这样的精确分数(这一事实并不意味着它可以精确地存储所有整数。 例如,外观相似的代码
long int x = 123456789;
float y = 123456789.0;
if(x == (long int)y) printf("expectedn");
else printf("surprisen");
再次很可能打印出令人惊讶的结果。