Ответ 1
Используйте метод sqrt
для десятичного
>>> from decimal import *
>>> getcontext().prec = 100
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573')
>>>
Я был очень разочарован, когда decimal.Decimal(math.sqrt(2))
дал
Decimal('1.4142135623730951454746218587388284504413604736328125')
и цифры после пятнадцатого десятичного разряда оказались ошибочными. (Несмотря на счастливое предоставление вам более 15 цифр!)
Как я могу получить первые m
правильные цифры в десятичном расширении sqrt(n)
в Python?
Используйте метод sqrt
для десятичного
>>> from decimal import *
>>> getcontext().prec = 100
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573')
>>>
Вы можете попробовать bigfloat. Пример на странице проекта:
from bigfloat import *
sqrt(2, precision(100)) # compute sqrt(2) with 100 bits of precision
Стандартные числа с плавающей точкой двойной точности 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
Как я могу получить первые m правильных цифр в десятичном расширении sqrt (n) в Python?
Один из способов - вычислить целочисленный квадратный корень числа, умноженного на требуемую мощность 10. Например, чтобы увидеть первые 20 знаков после запятой sqrt(2)
, вы можете сделать:
>>> from gmpy2 import isqrt
>>> num = 2
>>> prec = 20
>>> isqrt(num * 10**(2*prec)))
mpz(141421356237309504880)
Функция isqrt
на самом деле довольно легко реализовать себя, используя алгоритм, предоставленный на странице Википедии.