Произвольная точность квадратных корней

Я был очень разочарован, когда decimal.Decimal(math.sqrt(2)) дал

Decimal('1.4142135623730951454746218587388284504413604736328125')

и цифры после пятнадцатого десятичного разряда оказались ошибочными. (Несмотря на счастливое предоставление вам более 15 цифр!)

Как я могу получить первые m правильные цифры в десятичном расширении sqrt(n) в Python?

Ответы

Ответ 1

Используйте метод sqrt для десятичного

>>> from decimal import *
>>> getcontext().prec = 100
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573')
>>> 

Ответ 2

Вы можете попробовать bigfloat. Пример на странице проекта:

from bigfloat import *
sqrt(2, precision(100))  # compute sqrt(2) with 100 bits of precision

Ответ 3

Стандартные числа с плавающей точкой двойной точности IEEE имеют только 16 цифр точности. Любое программное обеспечение/аппаратное обеспечение, использующее IEEE, не может сделать лучше:

http://en.wikipedia.org/wiki/IEEE_754-2008

Вам понадобится специальная реализация класса BigDecimal, с использованием всех математических функций для ее использования. У Java есть такая вещь. Python тоже:

http://en.literateprograms.org/Arbitrary-precision_elementary_mathematical_functions_%28Python%29

Ответ 4

Как я могу получить первые m правильных цифр в десятичном расширении sqrt (n) в Python?

Один из способов - вычислить целочисленный квадратный корень числа, умноженного на требуемую мощность 10. Например, чтобы увидеть первые 20 знаков после запятой sqrt(2), вы можете сделать:

>>> from gmpy2 import isqrt
>>> num = 2
>>> prec = 20
>>> isqrt(num * 10**(2*prec)))
mpz(141421356237309504880)

Функция isqrt на самом деле довольно легко реализовать себя, используя алгоритм, предоставленный на странице Википедии.