printf浮点的默认精度历史是多少?

时间:2015-08-20 11:39:22

标签: c standards

在使用printf格式化浮点数时,似乎每个人都使用6个字符的默认精度。

为什么6?

在32位浮标被广泛使用之前是否出现过这种情况?

3 个答案:

答案 0 :(得分:6)

根据Wikipedia,具有32位的浮点的通用IEEE 754表示具有大约7个十进制数字的精度。所以6看起来是合理的价值。

您需要双精度(64位)才能获得大约16位十进制数字。

答案 1 :(得分:3)

嗯,不,这在32位浮点数被广泛使用之前没有出现。第一个浮点表示 - 在IEEE规范存在之前就已经存在 - 是32位(或左右),因此没有"默认精度"用于在此之前输出浮点值。

无论如何,对于32位浮点类型,有效数或尾数的典型大小为20到25位(IEEE 32位浮点数的有效位数为24位),表示四到七位有效十进制数字表示最高精度。 (24*log(2)大致等于7.2)。

典型的64位浮点表示具有介于50和55位之间的有效位(64位IEEE表示具有53位有效位数),其表示最大精度的大约十五个小数位。

这意味着程序员经常默认在5到6位小数之间输出浮点值。较低的精度会截断值(增加打印值并再次读取时产生的误差),更高的精度会导致输出"噪声" (小数点后面的杂散数字,影响了人类的可读性,并没有帮助写/读往返)。

所有这些都早于C - 实际上它早于Algol(早期编程语言之一,其设计影响的语言是C的祖先)。

答案 2 :(得分:2)

printf的历史中,6位数的默认值至少可以追溯到第5版Unix。参见古代源代码:

  • fltpr.s实现pfloat的{​​{1}}函数和实现%f的{​​{1}}函数都在指令中包含幻数6 pscien
  • printf.s在找到%emov $6,_ndigit转化时调用pfloatpscien。一个重要的变量是%f,如果转换没有指定位数,它将为0。
  • ecvt.s实际生成数字字符串的%endfnd函数