Нахождение числа до n десятичных знаков в Python.Также надежен ли math.pi от python? - PullRequest
1 голос
/ 21 июня 2019

Я видел здесь, как найти sqrt (2) до 100 цифр в python:

import decimal
number = decimal.Decimal(2)
precision = decimal.Context(prec = 100)
print (number.sqrt(precision))

Я тестировал и работал нормально.Когда я пытаюсь использовать этот код для пи, печать не работает.Я пробовал

print (number.(precision)), print (number(precision)) и т. Д. Как должна быть последняя строка?

import decimal
number = decimal.Decimal(math.pi)
precision = decimal.Context(prec = 100)
print (???)

Я использую netbeans.Однако я могу напечатать sqrt (pi).

РЕДАКТИРОВАТЬ: Спасибо, ребята!

Python возвращает: 3.141592653589793-1-159979634685441851615905761718750

Wolfram возвращает 3.141592653589793-2-384626433832795028841971693993751

Только после 14 цифр ответы расходятся.Является ли math.pi из python надежным?

Достаточно странно, но sqrt (2) до 1000 цифр в python и wolfram дает тот же ответ.

Ответы [ 4 ]

2 голосов
/ 21 июня 2019

Вы можете делать что хотите, используя format и указав количество мест:

from math import pi
print (format (pi,'.100f'))

Другое решение - использование библиотеки mpmath:

from mpmath import mp
mp.dps = 100    # set number of digits
print(mp.pi)
0 голосов
/ 21 июня 2019

Другие ответы верны для печати с определенной точностью. Однако, если вы попробуете их с Decimal(math.pi), вы получите 3.141592653589793115997963468544185161590576171875, очевидно, менее 100 цифр, и даже эти цифры не все верны. Причина этого в том, что math.pi - это число с плавающей точкой, точность которого ограничена.

Чтобы фактически вычислить правильные цифры числа Пи с любой точностью, вы можете использовать этот код (взят из официальной документации Python для decimal библиотеки ):

def pi():
    """Compute Pi to the current precision.

    >>> print(pi())
    3.141592653589793238462643383

    """
    getcontext().prec += 2  # extra digits for intermediate steps
    three = Decimal(3)      # substitute "three=3.0" for regular floats
    lasts, t, s, n, na, d, da = 0, three, 3, 1, 0, 0, 24
    while s != lasts:
        lasts = s
        n, na = n+na, na+8
        d, da = d+da, da+32
        t = (t * n) / d
        s += t
    getcontext().prec -= 2
    return +s               # unary plus applies the new precision

Предполагается, что вы установили getcontext().prec на требуемую точность.

0 голосов
/ 21 июня 2019

Если вы просто хотите напечатать число с определенной точностью, сделайте следующее:

from decimal import Decimal
number = decimal.Decimal(math.pi)
print(format(number,'.100f'))

В противном случае вы можете сделать следующее, чтобы установить точность:

from decimal import getcontext, Decimal

getcontext().prec = 100
number = Decimal(math.pi)

print(number)
0 голосов
/ 21 июня 2019

Другая возможность:

import math
from decimal import getcontext, Decimal

getcontext().prec = 100
number = Decimal(math.pi)

print(number)
...