Мне нужно сделать программу, которая читает 2 ввода: 1-е содержит неотрицательное целое число n, не более 1 миллиарда (109), 2-е содержит неотрицательное целое число k (желаемая точность, измеренная дробными цифрами),не более 10 тысяч (104). Программа должна распечатать одно число на стандартный вывод. Это число должно быть квадратным корнем из n, взятым с точностью до k дробных цифр, всегда округляя вниз всякий раз, когда необходимо некоторое округление. (В случае, когда k = 0, результат должен быть округлен до ближайшего целого числа).
Это моя вторая задача, и я написал приведенный ниже код для его вычисления с использованием метода Ньютона.
Программа может свободно предполагать, что ввод будет соответствовать вышеуказанным условиям
Программа работает, но число десятичных разрядов не всегда корректно, чтобы решить эту проблему, я попытался добавить некоторое условие для увеличения getcontext (). Предварительно одно единство в соответствии с первым прочитанным числом. Но не решил проблему, так как для: - x <10 ^ 2: результат правильный - x> = 10 ^ 2 & x <10 ^ 4: результат правильный unitl x = 3000, тогда десятичная позиция неверна -1. </p>
from decimal import *
from _decimal import Decimal
def sqrt(x):
last_guess = x/2.0
error = (1/(10**y))
while True:
guess = Decimal((last_guess + x/last_guess )/2)
if abs(Decimal(guess) - Decimal(last_guess)) < error: # example threshold
return Decimal(guess)
last_guess = Decimal(guess)
print(last_guess)
x = int(input("Calculate the square root of : "))
y = int(input("Decimal positions : "))
if x < 10**2:
getcontext().prec = y + 1
if x >= 10**2 and x < 10**4:
getcontext().prec = y + 2
if x >= 10**4 and x < 10**6:
getcontext().prec = y + 3
if x >= 10**6 and x < 10**8:
getcontext().prec = y + 4
if x >= 10**8 and x < 10**10:
getcontext().prec = y + 5
if x >= 10**10 and x < 10**12:
getcontext().prec = y + 6
if x >= 10**12 and x < 10**14:
getcontext().prec = y + 7
a =sqrt(x)
if x < 10**2:
getcontext().prec = y + 1
if x >= 10**2 and x < 10**4:
getcontext().prec = y + 2
if x >= 10**4 and x < 10**6:
getcontext().prec = y + 3
if x >= 10**6 and x < 10**8:
getcontext().prec = y + 4
if x >= 10**8 and x < 10**10:
getcontext().prec = y + 5
if x >= 10**10 and x < 10**12:
getcontext().prec = y + 6
if x >= 10**12 and x < 10**14:
getcontext().prec = y + 7
print("The square root of ",x," is : ", Decimal(a))
# print("The original number: ", Decimal(a)**2)
Для ввода
8765 8
ваша программа должна распечатать
93.62157870
Для ввода
3000 3
ваша программа должна распечатать
54,772