【问题标题】:printf behaviour in CC中的printf行为
【发布时间】:2019-04-06 04:17:00
【问题描述】:

我正在尝试了解以下内容之间的区别:

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

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

【问题讨论】:

  • 你观察到的区别是什么?

标签: c floating-point printf


【解决方案1】:

使用“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 这样的简单十进制值也不能完全这样表示。

【讨论】:

    猜你喜欢
    • 2022-12-21
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多