根据这个帖子,当比较 float 和 double 时,float 应被视为 double。
下面的程序,似乎并不遵循这个说法。这种行为看起来相当不可预测。
这是我的程序:
void main(void)
{
double a = 1.1; // 1.5
float b = 1.1; // 1.5
printf("%X %X\n", a, b);
if ( a == b)
cout << "success " <<endl;
else
cout << "fail" <<endl;
}
- 当我运行以下程序时,显示“失败”。
- 但是,当我将a和b更改为1.5时,它显示“成功”。
我还打印了值的十六进制符号。这两种情况都是不同的。我的编译器是Visual Studio 2005
你能解释一下这个输出吗?谢谢。
float f = 1.1;
double d = 1.1;
if (f == d)
在此比较中,值f
被提升为类型double
。您看到的问题不在于比较,而在于初始化。1.1
不能精确地表示为浮点值,因此存储在f
and d
是可以表示的最接近的值。但float
and double
大小不同,因此有效位的数量也不同。当值在f
被提升为double
,无法找回存储值时丢失的额外位,因此最终会在额外位中得到全零。这些零位与中的位不匹配d
,所以比较是错误的。比较成功的原因是1.5
就是它1.5
can精确地表示为float
并作为double
;它的低位有一堆零,因此当促销添加零时,结果与double
表示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)