如何解决有没有一种方法可以在Python上创建更多小数点而无需导入库/模块?
我面临一个挑战,要在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
但是我需要计算其余的零。有什么建议需要在代码中解决?
解决方法
整数在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')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。