gpt4 book ai didi

python - 在`decimal.Decimal(1.0/3.0)`中有27位额外的精度吗?

转载 作者:太空狗 更新时间:2023-10-30 01:53:54 25 4
gpt4 key购买 nike

这篇文章是关于表达式decimal.Decimal(1.0/3.0)significant digits的数目。
decimal.Decimal的文献表明
由此,我认为decimal.Decimal(1.0/3.0)中的有效位数应该由ieee 754双精度机中的有效位数来决定。
现在,据我所知,ieee 754 64位双精度有一个“
"[t]he significance of a new Decimal is determined solely by the number of digits input"”。
因此,综上所述,我预计1.0/3.0最多有17个有效小数位数。
然而,decimal.Decimal(1.0/3.0)至少有54位有效的十进制数字:

import decimal
print decimal.Decimal(1.0/3.0)

# 0.333333333333333314829616256247390992939472198486328125

从这一切中可以总结出两个关键问题:
ieee 754双精度有 15-17 significant decimal digits precision的说法的依据是什么?
如何解决以下项目之间的矛盾?以下内容:
上文引用的 decimal.Decimal(1.0/3.0)文件
decimal.Decimal中的54位(或更多)有效数字
对于IEEE 754的两倍,最大小数位数的最大值为17。
补遗:好的,我现在对情况有了更好的了解,感谢AJCR的回答和一些额外的评论。
在内部, decimal.Decimal(1.0/3.0)表示 decimal作为分数
6004799503160661/18014398509481984

这个分数的分母是254。分子是(254-1)/3。
确切地说,这个分数的十进制表示法。
0.333333333333333314829616256247390992939472198486328125

补遗2:再试一次。浮点数f是一组不可数实数的替补。这组值包括由浮点数f精确表示的有理数q(f),也包括q(f)上下不可数的实数。现在,假设实数r在64位ieee 754 double的范围内,让f(r)是r被表示为浮点数1时映射到的双精度数。
例如,如果r=1/3,则f(r)是由以下64位给出的ieee 754双精度:
0 01111111101 0101010101010101010101010101010101010101010101010101 = F(R)

……q(f(r))是分数n/d,其中d=254=1801439809481984,n=(254-1)/3=6004799503160661。简而言之:
6004799503160661/18014398509481984 = Q(F(R))

或者,作为精确的小数:
0.333333333333333314829616256247390992939472198486328125 = Q(F(R))

但是浮点f(r)不仅代表r=1/3和q(f(r))=n/d,而且代表所有实数
在范围(a,b)2中,其中a=(2×n 1)/2 d d,b=(2±n+1)/2 d。下面,我展示了< q(f(r))< b的精确十进制表示,以及54=r=1/3的不精确表示:
0.3333333333333332593184650249895639717578887939453125   = A
0.333333333333333314829616256247390992939472198486328125 = Q(F(R))
0.333333333333333333333333333333333333333333333333333333 ~ R
0.33333333333333337034076748750521801412105560302734375 = B

现在,这里是四个数字A、Q(F(R))、R和B的十进制表示,但现在舍入到17个重要数字:
0.33333333333333326 ~ A
0.33333333333333331 ~ Q(F(R))
0.33333333333333333 ~ R
0.33333333333333337 ~ B

这至少可以解释为什么ieee 754双精度被称为“15-17位有效小数精度”。更明确地说,由给定的IEEE 754双倍表示的任意两个实数的十进制表示在它们的最重要数字的15和17之间是一致的。
好,回到q(f(r))。是的,这是一个有理数,它的分母是2的幂,因此我们可以精确地计算它的十进制展开式。这个扩展中的重要数字的数量简直是无限的。但是这个数字在这里的作用严格地是一个不可数的实数集合的典型代表,所有这些数字共有17个重要的数字。因此,在Q(f(r))的扩展中使用任何有意义的数字等于对这组实数的误传。在q(f(r))的小数展开中,最不重要的27个数字在这个意义上,是关于q(f(r))的作用,在(a,b)中,包括r中的所有数字的无关的,不相关的,确实不显著的。
换言之,当在其作为间隔(a,b)的代表作用中起作用时,q(f(r))应该是公正的。
0.33333333333333331 ~ Q(F(R))

其小数扩展的其余部分与此角色没有密切关系,因此,应将其排除在外。
我意识到,在给定所有需求的情况下,把设计做得比它更好是很困难的。实际上,上述虚假陈述可能是不可避免的。然而,至少应该清楚地记录,以及所有其他与浮点数相关的不可避免的错误陈述。
1是的,我保持IEEE 754双f(R)(内存中的特定序列)和有理数q(f(r))(数学实体)之间的区别,只要绝对清楚。
2我想它也包括这个范围的端点之一,但是这个细节在这里不重要。

最佳答案

当传递浮点值时,decimal使用from_float构造函数。这个类方法精确地从一个python float构造一个十进制;它不知道float是如何计算的,而且人类可能认为它只精确到一定数量的数字。
相反,它通过将浮点数视为两个整数的比率来确定从浮点数中获取的适当位数。这是740号线:

n, d = abs(f).as_integer_ratio()
k = d.bit_length() - 1
result = _dec_from_triple(sign, str(n*5**k), -k)

这意味着对于 1.0/3.0我们有以下内容:
>>> f = 1.0 / 3.0
>>> f.as_integer_ratio()
(6004799503160661, 18014398509481984)
>>> (18014398509481984).bit_length()
55

为了构造小数点,计算符号、系数和指数并传递给 _dec_from_triple。在这种情况下,系数是字符串:
'333333333333333314829616256247390992939472198486328125'

指数是 -(55-1)。这就给了小数点后54位精确的小数点,因此你的观察。

关于python - 在`decimal.Decimal(1.0/3.0)`中有27位额外的精度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33957519/

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