Квадратный корень из 50 знаков после запятой без импорта десятичной или математической функции

#python #square-root

#python #квадратный корень

Вопрос:

Можно ли вычислить до 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"

Комментарии:

1. Что не так с импортом математической или десятичной функции?

2. Ничего. Они оба работают хорошо, но я хотел выяснить, можно ли распечатать 50 знаков после запятой, не используя его, поскольку вывод по умолчанию намного короче. Другой способ выразить это, могу ли я изменить значение по умолчанию, чтобы сделать его таким длинным, как я хочу. Я попробовал функцию форматирования, но, похоже, она не сработала.

3. Ваша squareRoot функция ничего не возвращает, so s is None , что приводит format к возникновению ошибки.

4. Пожалуйста, обновите свой вопрос относительно того, что вы на самом деле хотите знать.

5. Числа с двойной точностью имеют 53 бита (16 цифр) точности, которые использует обычный Python с плавающей запятой . Таким образом, вы не можете получить 50 цифр точности только с обычными плавающими числами Python (т. Е. Нужна десятичная или какая-либо другая библиотека).

Ответ №1:

Первое, что вы должны упомянуть, это то, что ваша sqrt функция не возвращает никакого значения. Таким образом, ничего не возвращается. Просто добавьте строку

 return(x)
  

до конца определения функции и лучше удалите строку print(x) , чтобы ваша функция возвращала значение вместо его печати.

Но вопрос глубже. Прежде всего, обратите внимание, что float длина в python 3 (встроенная) составляет всего ок. 16 десятичных цифр после точки. Таким образом, мы не можем вычислить более точно. Существуют модули, которые могут позволить вам это сделать: numpy поддерживает float128 (прибл. 32 десятичных знака), если этого недостаточно — посмотрите на Decimal или mpmath . Оба хорошо документированы и поддерживают более высокую точность. Встроенного метода нет.

Статья о высокоточных вычислениях в python и причинах, по которым они требуются: https://habr.com/ru/post/305276 /