【问题标题】:Square root to 50 decimal places without importing decimal or math function平方根到小数点后 50 位,无需导入小数或数学函数
【发布时间】:2021-01-21 09:43:45
【问题描述】:

是否可以在不使用小数导入的情况下计算到小数点后 50 位?下面打印了我想要的,但我想知道如何在没有任何数学或小数导入的情况下做到这一点。


def sqrt2(num, P):
    decimal.getcontext().prec = P + len(str(num)) + 2
    x = decimal.Decimal(num)
    y = decimal.Decimal(1)
    e = decimal.Decimal(10) ** decimal.Decimal(-P)
    while (x - y >= e):
        x = (x + y) / 2
        y = num / x

    
print (sqrt2(2, 50)) 

我也试过了:

    x=n
    y=1.000000 
    e=0.000001 
    while x-y > e:
        x=(x+y)/2
        y=n/x
    print (x)

n = 2
squareRoot(n)

s = squareRoot(n)
a = format(s, ".2f")
print (s)

但收到错误消息"unsupported format string passed to NoneType"

【问题讨论】:

  • 导入数学或小数有什么问题?
  • 没什么。它们都运行良好,但我想知道是否可以在不使用它的情况下打印出 50 个小数位,因为默认输出要短得多。另一种说法是,我可以修改默认值以使其随心所欲。我尝试了格式化功能,但它似乎不起作用。
  • 你的squareRoot 函数没有返回任何东西,所以sNone,这会导致format 引发错误。
  • 请将您的问题更新为您真正想知道的内容。
  • 双精度数具有 53 位(16 位)的精度,这就是 Python normal floating-point uses。因此,仅使用普通的 Python 浮点数(即需要 Decimal 或其他一些库)无法获得 50 位的准确度。

标签: python square-root


【解决方案1】:

首先你应该提到的是你的sqrt 函数没有返回任何值。所以 None 被返回。只需添加一行

return(x)

到函数定义的末尾,最好也删除行 print(x) 以使您的函数返回值而不是打印它。

但问题更深。首先,提一下,python 3(内置)中的float 长度仅为大约。点后 16 位小数。所以我们不能更精确地计算。有一些模块可以让你这样做:numpy 支持 float128(大约 32 个十进制数字),如果这还不够 - 看看 Decimal 或 mpmath。两者都有据可查并支持更高的精度。没有内置方法。

一篇关于 python 中的高精度计算以及需要它们的原因的文章: https://habr.com/ru/post/305276/

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多