C

时间:2018-11-01 21:42:56

标签: c printf

我试图了解以下内容之间的区别:

printf("%f",4.567f);
printf("%f",4.567);

使用f后缀如何更改/影响输出?

1 个答案:

答案 0 :(得分:5)

  

如何使用'f'更改/影响输出?

浮点常量末尾的f确定类型,并且可以影响该值。


4.567double类型和精度的浮点常量。 double可以代表大约2 64 个不同的值。 4.567不是它们中的一个 * 1 。最接近的替代方法通常是

4.56700000000000017053025658242404460906982421875     // best
4.56699999999999928235183688229881227016448974609375  // next best double

4.567ffloat类型和精度的浮点常量。 float可以代表典型的大约2 32 个不同的值。 4.567不在他们身上。最接近的替代方法通常是

4.566999912261962890625  // best
4.56700038909912109375   // next best float

当作为printf()扩充的一部分传递给...时,float将转换为具有相同值的double

所以问题就变成了预期的印刷差异是什么?

printf("%f",4.56700000000000017053025658242404460906982421875);
printf("%f",4.566999912261962890625);

由于"%f"要打印的小数点后的默认位数为6,因此两轮的输出均舍入为:

4.567000

要查看差异,请使用more precision打印或尝试使用4.567e10, 4.567e10f

45670000000.000000 // double
45669998592.000000 // float

您的输出可能会因实施质量而略有不同。


* 1 C支持许多浮点编码。常见的是binary64。因此,典型的浮点值被编码为 sign *二进制分数* 2 指数 。即使像0.1这样的简单十进制值也无法完全表示出来。