C语言 使用比较运算符比较具有相同值的 int 和浮点变量时会发生什么?



当使用比较运算符比较具有相同值的整数和浮点变量时会发生什么?

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)

请注意,即使从intfloat的转换失去精度(在您的情况下不会(,也会发生这种情况。

一个好的一般规则是,你永远不应该比较浮点数的精确相等性。 著名的,看起来简单的代码片段,如

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这样的东西,即使xy有不同的类型。 通常发生的情况是编译器将隐式转换插入到通用类型。 所以当你写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");

再次很可能打印出令人惊讶的结果。

相关内容

  • 没有找到相关文章

最新更新