gpt4 book ai didi

python - 这是 python 的 gmpy2 中的错误吗?

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:50 25 4
gpt4 key购买 nike

一个简单的浮点加法 x+y in,精度为 4(即 IEEE 尾数宽度为 3),指数为 3 位(emax=3emin=-4) 对于 x = mpfr('0.75')y = mpfr('0.03125') 错误地给出 mpfr('0.75')结果应该是 mpfr('0.8125')。请注意,0.3125 是此降低精度格式的次正规数。

编辑:从链接中提取的终端交互并包括在内以供将来引用。

>>> "{0:.10Df}".format(mpfr('0.75')+mpfr('0.03125'))
'0.7500000000'
>>> get_context()
context(precision=4, real_prec=Default, imag_prec=Default,
round=RoundToNearest, real_round=Default, imag_round=Default,
emax=3, emin=-4,
subnormalize=True,
trap_underflow=False, underflow=False,
trap_overflow=False, overflow=False,
trap_inexact=False, inexact=True,
trap_invalid=False, invalid=False,
trap_erange=False, erange=False,
trap_divzero=False, divzero=False,
trap_expbound=False,
allow_complex=False)
>>>

最佳答案

免责声明:我维护 gmpy2。

我认为这是从字符串创建次正规的错误。我认为它在开发代码中是固定的,但我以后才能测试。我稍后会更新这个答案。

更新

问题与从字符串创建次正规无关。在这种情况下,正确创建次正规值。在 gmpy2 2.0.x 中,将字符串转换为次正规时存在一个罕见的错误。最简单的解决方法是先将输入转换为 mpq 类型;即 mpfr(mpq('0.03125'))

实际问题是默认的舍入模式。中间和正好是两个 4 位值之间的一半。 RoundToNearest 的默认舍入模式选择最后一位为 0 的舍入值。如果将舍入模式更改为 RoundUp,您将获得预期的结果。

>>> from gmpy2 import *
>>> ctx=context(emax=4, emin=-4, precision=4)
>>> set_context(ctx)
>>> a=mpfr('0.75')
>>> b=mpfr('0.03125')
>>> "{0:.10Df}".format(a+b)
'0.7500000000'
>>> get_context().round=RoundUp
>>> "{0:.10Df}".format(a+b)
'0.8125000000'

最后一条评论:precisionemaxemin 的值在 IEEE 标准和 MPFR 库之间略有不同。如果 e 是指数大小而 p 是精度(在 IEEE 术语中),则 precision 应该是 p+1,emax 应该是 2**(e-1)emin 应该是 4-emax-precision。这不会影响您的问题,因为它只会更改 emax

关于python - 这是 python 的 gmpy2 中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34881078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com