【发布时间】:2019-04-06 04:17:00
【问题描述】:
我正在尝试了解以下内容之间的区别:
printf("%f",4.567f);
printf("%f",4.567);
使用f 后缀如何改变/影响输出?
【问题讨论】:
-
你观察到的区别是什么?
标签: c floating-point printf
我正在尝试了解以下内容之间的区别:
printf("%f",4.567f);
printf("%f",4.567);
使用f 后缀如何改变/影响输出?
【问题讨论】:
标签: c floating-point printf
使用“f”如何改变/影响输出?
浮点常量末尾的f 确定类型并可能影响值。
4.567 是double 类型和精度的浮点常量。 double 可以完全代表大约 264 个不同的值。 4.567 不是其中之一*1。最接近的选择通常是确切的
4.56700000000000017053025658242404460906982421875 // best
4.56699999999999928235183688229881227016448974609375 // next best double
4.567f 是float 类型和精度的浮点常量。 float 可以完全代表大约 232 个不同的值。 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。因此,典型的浮点值被编码为 符号 * 二进制小数 * 2exponent。即使是像 0.1 这样的简单十进制值也不能完全这样表示。
【讨论】: