Float数据类型及其赋值背后的概念

时间:2012-08-17 09:34:07

标签: c floating-point type-conversion

请向我解释这两段代码背后的输出/概念。

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

3 个答案:

答案 0 :(得分:3)

在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将浮点值与double值进行比较。 (这会隐式地将float转换为double,但在此转换期间值不会更改。)由于值不相等,因此比较结果为0.。

由于3.5可以完全表示为double,因此数字“3.5”恰好产生值3.5。这也可以表示为float,因此将其转换为float会产生3.5。然后比较这两个值产生1。

(这个答案假设IEEE 754浮点,这很常见。)

答案 1 :(得分:1)

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.5floatdouble(作为0x1.cp+1)中完全可以表示,因此比较相同。

比较结果为1(等于)或0(对于不等),并且您将比较结果打印为浮点数。

答案 2 :(得分:0)

3.3不是float而是double:您正在比较具有不同精度的数字。