I'm getting seemingly unfounded errors with this seemingly easy program..

the variables "guess" and "i" are user input

``````for guess in range (i):
float(guess + float(x / guess)) / 2
print guess``````

I'm getting: ZeroDivisionError: integer division or modulo by zero

3
Contributors
4
Replies
5
Views
9 Years
Discussion Span
Last Post by jlm699

Maybe you want this:

for guess in range (1, i):

That did help, but I must have something really screwed up with the actual implementation of the for statement. Here is the full program.

``````import math
from random import randint

x = randint(2, 100)
print "The root is", x

def main():

guess = input("Guess what the square root is: ")
i = input("How many times should Newton's improve the guess?: ")

print "~" * 50

for guess in range (1, i):
float((float(x / guess) + guess) / 2)

print "Your final guess was", guess, "."

if check == 0:
print "Your guess was right on!"

else :
print "You were", check, "away from the correct answer"

main()``````

I get this as an output:

``````The root is 90
Guess what the square root is: 9
How many times should Newton's improve the guess?: 15
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Your final guess was 14 .
The right answer was 9.48683298051 ...
You were 4.51316701949 away from the correct answer``````

So, apparently the for statement makes my guesses worse. Thanks in advance

So, apparently the for statement makes my guesses worse. Thanks in advance

Look at what `range(15)` and `range(1,15)` produce:

``````>>> range(15)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> range(1,15)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>>``````

You're leaving off the number 15 (if that's what you were shooting for).

Now just out of curiosity, what is the purpose behind your for loop? As it stands, it isn't doing anything. It's simply doing some arbitrary calculations but never updating any values or storing any results.

Also, what's with the multiple float casting? Only one operand needs to be a float in order to invoke true division in Python < 3.0 ... that means you could simply put `guess = float(guess)` before the calculation line and remove all float casting and achieve the same output. **EDIT** Actually, I just checked and it's actually waaay more accurate to remove that float casting and simply use `guess = float(guess)` followed by `result = ((x / guess) + guess) / 2` .

Actually the more I try to get this code working the more I realize that you might be confusing your variable names.... you're iterating over guess in your for loop, but then also using it afterwards to say what the final guess was... which will always be the last value of the for loops iteration. So on a `range(1,15)` call, guess will start at `guess = 1` , then on the next iteration it'll be `guess = 2` , then `guess = 3` , and so on until it becomes `guess = 14` to end the loop.

Also, you never convert the "number of times" that the user enters to a number, you're leaving it as a string... try to wrap that input with a call to `int()` I also should re-state that you need to re-think the way you're casting your floats... instead of the following:

``````for guess in range (1, i):
float((float(x / guess) + guess) / 2)

``````for some_value in range (1, i):
And one last thing: You should use raw_input instead of input (if this is a 2.X version of Python). Check what happens if the user enters `4 * 5` into an `input()` prompt and then think about what would happen if they entered any malicious code....