有没有办法在不导入 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')
我遇到了一个挑战,要在 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')