python中math的ln_在cpython中的_math.c中的ln2 const值

正如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位近似.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值