正如user2357112所指出的,此代码来自FDLIBM.这是为IEEE-754机器精心编写的,其中C双精度具有53位精度.它并不真正关心2的实际日志是什么,而是关注log(2)的最佳53位近似.
那么为什么他们使用21位小数呢?我的猜测:21位十进制数是保证转换结果正确到64位精度所需的最小值.如果编译器以某种方式决定将文字转换为Pentium的80位浮点格式(具有64位精度),那么当时可能是一个问题.
所以他们用足够的十进制数字显示53位结果,这样如果它被转换为具有64位精度的二进制浮点格式,则尾随的11位(= 64-53)将全为零,从而确保它们是使用他们从一开始就想要的53位值.
>>> import mpmath
>>> x = mpmath.log(2)
>>> x
mpf('0.69314718055994529')
>>> mpmath.mp.prec = 64
>>> y = mpmath.mpf("0.693147180559945286227")
>>> x == y
True
>>> y
mpf('0.693147180559945286227')
在英语中,x是log(2)的53位精确值,y是将代码中的十进制字符串转换为64位精度的二进制浮点格式的结果.他们是完全相同的.
在当前的现实中,我希望所有编译器现在将文字转换为本机IEEE-754双格式,具有53位精度.
无论哪种方式,代码确保将使用log(2)的最佳53位近似.