有没有办法在不导入 library/module 的情况下在 Python 上创建更多小数点?

Is there a way to create more decimal points on Python without importing a library/module?

我遇到了一个挑战,要在 python 中计算一个小数点后 100 位的数字,而不使用任何导入的模块,例如计算 2

的平方根

由于这是一项学术挑战,这意味着我无法导入 decimal、sympy、evalf、gmpy2 和其他可以根据此处的回复使用的建议 how can i show an irrational number to 100 decimal places in python?

我也尝试过使用范围以 0.0000000000001 等为步长进行计算,但这需要使用 Numpy How to use a decimal range() step value?

当我计算 2 的平方根时,Python 只显示 16 位小数。 1.4142135623746899

我明白 Python 不会保留更多小数位 https://docs.python.org/3.4/tutorial/floatingpoint.html

背后的原因

我试着创造性地思考并计算了平方根 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

但是 Python 又不是 return 一个完整的数字,我得到这样的答案

1.414213562373095e+50

显示潜在前景的解决方案是使用格式

def mySqrt(x):

r = x
precision = 10 ** (-10)

while abs(x - r * r) > precision:
    r = (r + x / r) / 2

return r

find_square_root_of = 2
answer = format(mySqrt(find_square_root_of), ',.100f')
print(answer)

这给了我

的答案

1.4142135623746898698271934335934929549694061279296875000000000000000000000000000000000000000000000000

但我需要计算其余的零。关于代码中需要修复的内容有什么建议吗?

整数在 python 中是天生的任意精度。您已经有了找到 2*10**100 的平方根的好主意,并给出了这样做的算法,但是您随后使用浮点数来实现该算法。如果您使用整数,那么它基本上应该可以工作(请注意,您需要 2*10**200 以便在平方根后留下 101 位数字)。当你接近截止点时,它只需要一点点调整就会发生什么。这是我的建议:

x = 2 * 10 ** 200

r = x

def test_diffs(x, r):
    d0 = abs(x - r**2)
    dm = abs(x - (r-1)**2)
    dp = abs(x - (r+1)**2)
    minimised = d0 <= dm and d0 <= dp
    below_min = dp < dm
    return minimised, below_min

while True:
    oldr = r
    r = (r + x // r) // 2

    minimised, below_min = test_diffs(x, r)
    if minimised:
        break

    if r == oldr:
        if below_min:
            r += 1
        else:
            r -= 1
        minimised, _ = test_diffs(x, r)
        if minimised:
            break

print(f'{r // 10**100}.{r % 10**100:0100d}')

给出:

1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727

比较:

>>> import decimal
>>> decimal.getcontext().prec=101
>>> Decimal("2").sqrt()
Decimal('1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727')