получение неполного ответа в качестве вывода функции

Я написал этот код для функции, которая реализует функцию sqrt, используя технику, известную как вавилонская функция. Он аппроксимирует квадратный корень числа n, многократно выполняя вычисления по следующей формуле:

nextGuess = (lastGuess + (n / lastGuess)) / 2

Когда значения nextGuess и lastGuess очень близки, nextGuess представляет собой приблизительный квадратный корень. Начальное предположение может быть любым положительным значением (например, 1). Это значение будет начальным значением для lastGuess. Если разница между nextGuess и lastGuess меньше очень небольшого числа, например 0,0001, то nextGuess — это приблизительный квадратный корень из n. В противном случае nextGuess становится lastGuess, и процесс аппроксимации продолжается.

def babyl(n):
    lastGuess=1.0
    while True:
        nextGuess=float(lastGuess+float(n/lastGuess))/2.0
        if abs(lastGuess-nextGuess)<0.0001:
            return nextGuess
        else:
            lastGuess=nextGuess
            nextGuess=float(lastGuess+float(n/lastGuess))/2.0
            if abs(lastGuess-nextGuess)<0.0001:
                return nextGuess

Вывод функции:

>>> babyl(9)
3.000000001396984
>>> babyl(16)
4.000000000000051
>>> babyl(81)
9.000000000007091
>>> 

Очень долго после точки, как вы видите.

Я хочу написать тестовую программу, в которой пользователь вводит положительное целое число, а функции возвращают его прибл. значение кв.

Итак, я закодировал:

n=input("Please sir, enter a positive integer number and you'll get the approximated sqrt:")
print babyl(n)

И ответ на это очень короткий:

>>> 
Please sir, enter a positive integer number and you'll get the approximated sqrt:16
4.0
>>> ================================ RESTART ================================
>>> 
Please sir, enter a positive integer number and you'll get the approximated sqrt:4
2.0
>>> ================================ RESTART ================================
>>> 
Please sir, enter a positive integer number and you'll get the approximated sqrt:9
3.0000000014
>>> 

Может кто-нибудь сказать мне, в чем разница между функцией и тестом?


person Netta    schedule 05.02.2016    source источник


Ответы (2)


Консоль использует repr( ) для отображения результата. print использует str( )

>>> import math; f = math.sqrt(10)
>>> str(f)
'3.16227766017'
>>> repr(f)
'3.1622776601683795'
>>> print f
3.16227766017

Странно, что вы упускаете точность в выводе. Ваш эпсилон равен 0,0001, что на несколько цифр короче, что приведет к очень плохой точности, по крайней мере, для этих небольших чисел. Зачем тогда беспокоиться о выводе?

person Karoly Horvath    schedule 05.02.2016

print вызывает __str__() объект float. Просто вызов функции в командной строке Python и предоставление Python возможности показать вам результат вызывает __repr__(). __str__() использует немного меньшую точность именно из-за проблем с точностью вычислений с плавающей запятой: многие дробные значения не могут быть сохранены точно, и это вызывает неточности в вычислениях с их участием.

person kindall    schedule 05.02.2016