有没有一种方法可以在Python上创建更多小数点而无需导入库/模块?

时间:2020-10-09 10:19:51

标签: python python-3.x decimal

我面临一个挑战,要在python中不使用任何导入的模块(例如计算2的平方根

由于这是一项学术挑战,这意味着我无法导入小数,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

做更多的解释

我试图创造性地思考并计算...的平方根 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

但是Python仍然没有返回完整的数字,我得到了这样的答案

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.4142135623746898698271934335934929549694061279296875000000000000000000000000000000000000000000000000000000

但是我需要计算其余的零。有什么建议需要在代码中解决?

1 个答案:

答案 0 :(得分:3)

整数在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')
相关问题