我试图了解以下内容之间的区别:
printf("%f",4.567f);
printf("%f",4.567);
使用f
后缀如何更改/影响输出?
答案 0 :(得分:5)
如何使用'f'更改/影响输出?
浮点常量末尾的f
确定类型,并且可以影响该值。
4.567
是double
类型和精度的浮点常量。 double
可以代表大约2 64 个不同的值。 4.567
不是它们中的一个 * 1 。最接近的替代方法通常是
4.56700000000000017053025658242404460906982421875 // best
4.56699999999999928235183688229881227016448974609375 // next best double
4.567f
是float
类型和精度的浮点常量。 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这样的简单十进制值也无法完全表示出来。