如何在Sagemath中提取数字的第n位?我们必须在Sagemath中计算pi + e
的第13787位数字。我的方法如下:
sage: xi = e + pi
....: var1 = xi.n(digits=13786+1)
....: var2 = xi.n(digits=13787+1)
....: var3 = ((var2-var1) * 10^13787).trunc()
....: var3
0
这给了我0
,但它应该是9
。
答案 0 :(得分:3)
这个数字确实是9.但随后的数字也是9:十进制扩展的这一部分变为...... 9999237 ...舍入将这些9s滚动到0,将1加到更高的数字。
所以你需要一些额外的数字,以避免你感兴趣的数字受到舍入的影响。多少取决于数量;如果从该位置开始没有10亿9的序列,我们事先不知道。这里我使用了10个额外的数字
xi = e + pi
n = 13787
offset = 1 + floor(log(xi, 10)) # the first significant figure is not always the first digit after decimal dot, so we account for that
extra = 10
digit = int(str(xi.n(digits = n + offset + extra))[-1 - extra])
这会返回9.我认为使用str
进行提取比减去两个几乎相等的数字更可靠,并希望那里不会有额外的精确丢失。
当然,包括像10这样的幻数并不可靠。这是一个更好的版本,从10个额外的数字开始,然后增加数字,直到我们不再有00000000 ...结果。
xi = e + pi
n = 13787
offset = 1 + floor(log(xi, 10))
extra = 10
while True:
digits = str(xi.n(digits = n + offset + extra))[-1 - extra:]
if digits == "0" * len(digits):
extra *= 2
else:
digit = int(digits[0])
break
print(digit)
如果数字保持为0,这将永远循环,正确如此:实际上不知道数字是什么,我们永远无法确定... 0000000 ...我们得到的是不是真的... 999999999942 ...四舍五入。