1

Я пытаюсь код, чтобы узнать радиус внутренних дерных кругов, код работает нормально, но я не получаю требуемую точность, я хочу, чтобы ответ был усечен до 50 цифр Пожалуйста, предложите, как я могу получить более точные расчеты Как я должен получить точность 50 цифрточность в python до 50 знаков после запятой

import math 
t=input() 
while t>0: 
    t-=1 
    r1,r2,r3=map(int,raw_input().split()) 
    k1=1.0/r1 
    k2=1.0/r2 
    k3=1.0/r3 
    k4=k1+k2+k3+2*math.sqrt(k1*k2+k2*k3+k3*k1) 
    r4=1.0/k4 
    print r4 
+0

http://docs.python.org/2/library/decimal.html – ndpu

ответ

3

Используйте decimal модуль. Храните все переменные, которые вы используете, как объекты decimal.Decimal.

Обновленный код:

from decimal import * 
import math 
context = Context(prec=1000) 
setcontext(context) 
t=input() 
while t>0: 
    t-=1 
    r1,r2,r3=map(Decimal,raw_input().split()) 
    k1=Decimal(1.0)/Decimal(r1) 
    k2=Decimal(1.0)/Decimal(r2) 
    k3=Decimal(1.0)/Decimal(r3) 
    k4=k1+k2+k3+2*(k1*k2+k2*k3+k3*k1).sqrt() 
    r4=Decimal(1.0)/Decimal(k4) 
    print r4 
+0

Почему это дает ошибку времени выполнения http://ideone.com/NzwcbT – user103260

+0

Практически правильно. Я обновлю код за минуту. – aIKid

+0

Ах, единственное, что было неправильно, это то, что вам нужно добавить 'import decimal' в начале вашей функции или удалить' decimal.' в строках 3 и 4. Теперь это должно работать. – aIKid

2

Если больше итераций должно дать лучшие результаты, то вы можете игнорировать входные данные t параметр и перебирать, пока результат не сходится в текущей точности:

import decimal 

#NOTE: separate user input from the algorithm 
#  no input inside `radius()` function 
def radius(r1, r2, r3): 
    with decimal.localcontext() as ctx: 
     ctx.prec += 2 # increase precision for intermediate calculations 
     prev = None # previous value 
     k1, k2, k3 = [1/decimal.Decimal(r) for r in [r1, r2, r3]] 
     while True: 
      # change some parameters to simulate converging algorithm 
      #NOTE: you don't need to wrap anything using `Decimal()` 
      k1 = k1 + k2 + k3 + 2*(k1*k2 + k2*k3 + k3*k1).sqrt() 
      r = 1/k1 
      if prev == r: # compare using enhanced precision 
       break 
      prev = r # save previous value 
    return +r # `+` applies current precision 

decimal.getcontext().prec = 50 # set desired precision 
print(radius(*map(int, raw_input().split()))) 

Рабочий пример, демонстрирующий этот метод, см. Gauss-Legendre Algorithm in python, которые вычисляют Pi до 100 цифр.