请解释一下这两条代码背后的输出/概念。
float x;
x=(float)3.3==3.3;
printf("%f",x);
上面的输出是 0.000000
float x;
x=(float)3.5==3.5;
printf("%f",x);
上面的输出是 1.000000
请解释一下这两条代码背后的输出/概念。
float x;
x=(float)3.3==3.3;
printf("%f",x);
上面的输出是 0.000000
float x;
x=(float)3.5==3.5;
printf("%f",x);
上面的输出是 1.000000
在 C 源文本中,数字“3.3”代表与数字 3.3 非常接近的 double 类型的值。好的编译器会将“3.3”转换为最接近 3.3 的 double 类型的值,即 3.29999999999999982236431605997495353221893310546875,但 C 标准并不要求这样做。
该表达式(float) 3.3
将此 double 转换为 float,从而生成最接近 double 的 float 类型的值。该值为 3.2999999523162841796875。
然后表达式(float) 3.3 == 3.3
将浮点值与双精度值进行比较。(这会将浮点数隐式转换为双精度数,但在此转换过程中值不会改变。)由于值不相等,因此比较的结果为 0。
由于 3.5 可以精确地表示为双精度数,因此数字“3.5”正好产生值 3.5。这也可以精确地表示为浮点数,因此将其转换为浮点数会产生 3.5。然后比较这两个值产生 1。
(这个答案假设 IEEE 754 浮点,这很常见。)
3.3
不能完全用二进制浮点表示(它包含一个重复的小数部分)。将double
文字转换3.3
为float
和转换回以double
进行比较会3.3
丢失精度,因此比较是不相等的。
对于 IEEE 64 位double
和 32 位float
:
3.3
量表示为0x1.a666666666666p+1
3.3f
表示为0x1.a66666p+1
,所以(float) 3.3
将是相同的0x1.a666660000000p+1
,这显然不等于3.3
。3.5
另一方面,float
和double
(as 0x1.cp+1
) 都可以精确表示,所以比较是相等的。
比较结果为1
(for equal) 或0
(for unequal),并且您将比较结果打印为浮点数。
3.3
is not a float
but a double
:您正在比较具有不同精度的数字。