2016-09-20 5 views
0

Я сделал простую функцию под названием «Приблизь», которая умножает два числа вместе, а затем делит их на два. Когда я использую функцию сам по себе, она отлично работает, но кажется, что в конусе кода у меня она не делит число пополам, и я понятия не имею, почему. Это мой код, где ошибка, и как я могу ее исправить?Число отказывается делиться

import math 

def Approx(low,high): 
    base = low * high 
    return base/2 

root = float(input("What to approx the sqrt of : ")) 
vague = float(input("How off can it be? : ")) 
wrong = True 
oroot = root 
root = math.floor(float(root)) 
trunk = root + 1 
step = 0 
while wrong: 
    if Approx(root,trunk) > oroot - vague and Approx(root,trunk) < oroot: 
     print("Done. " + str(step) + " steps taken.") 
    else: 
     if Approx(root,trunk) > oroot: 
      temproot = root 
      root = Approx(root,trunk) 
      trunk = temproot 
      step += 1 
      print("Step " + str(step) + " finished. Approx is " + str(Approx(root,trunk))) 
     else: 
      temptrunk = trunk 
      trunk = Approx(root,trunk) 
      root = trunk 
      step += 1 
      print("Step " + str(step) + " finished. Approx is " + str(Approx(root,trunk))) 
    if step > 50: 
     print("More than fifty steps required.") 
     wrong = False 
+4

Что заставляет вас думать, что деление не происходит? – user2357112

+0

Если неправильное поведение встречается в 'Approx (root, trunk)> oroot - неопределенный и Approx (root, trunk) (oroot - неопределенный) и (Approx (root, trunk) albert

+0

Каков желаемый выход 'Approx'? Вспомните разницу между '5 // 2' (' 5 // 2 = 2') и '5/2' (' 5/2 = 2.5') в Python 3. В то время как в Python 2 это наоборот. – albert

ответ

1

Мне кажется, что это определенно делает разделить на две части, это просто, что разделительный на два не отменяет умножения двух больших чисел вместе. Например, скажем, вы хотели найти квадратный корень из 10. trunk установлен в 11. Approx(root, trunk) - 10 * 11/2 = 55. Это значение равно root, а trunk становится старым root, 10. Теперь у вас есть 55 и 10 вместо 10 и 11. Повторите это несколько раз, и вы получите inf. Посмотрите больше на метод, который вы пытаетесь реализовать (это вавилонский метод?) И посмотрите, где ваша программа и метод отличаются. Вероятно, это источник ваших проблем, а не отсутствие разделения.

1

Ваша функция работает так, как вы ее описываете, однако я не понимаю, как вы используете ее в остальной части кода.

Похоже, вы пытаетесь приблизить квадратные корни, используя вариант метода Ньютона, но трудно понять, как вы его реализуете. Некоторые переменные в вашем коде не используются (что такое temptrunk?), И трудно определить, было ли это предназначено или ошибка.

Если это действительно новый метод, который вы хотели бы реализовать, вам понадобится функция приближения, которая сходится к целевому значению. Для этого вы вычисляете среднее арифметическое догадки и ваше целевое значение, деленное на это предположение (new_guess = mean([old_guess, target/old_guess])). После этого вам просто нужно сравнить разницу между new_guess и target, и как только он достигнет заданного порога (в вашем коде vague), вы можете разбить цикл.

Есть несколько способов, чтобы улучшить другие аспекты вашего кода:

  • Я бы не советовал, используя значение дозорного для выхода из цикла, break заявлений являются более явными.
  • Вы можете сразу сделать петлю иметь максимальное количество шагов, с:

    for step in range(MAX_STEPS): 
        guess = ... # try to guess 
        if abs(target - guess) < delta: 
         break 
    else: 
        print("Maximum steps reached.") 
    

    else блок будет вызываться только если break является не достигнута.