a/(a+b)
. That function threw a ZeroDivisionError
at me this afternoon, so I decided to change the equation to a/(a+b+sys.minfloat)
, because I felt that was more elegant than writing a conditional function to check if (a + b) == 0
. Turns out there is no 'minfloat' in the sys module, so I decided to write a function to calculate the smallest float myself.
>>> def minfloat(guess):
while(guess * 0.5 != 0):
guess = guess * 0.5
return guess
>>> minfloat(+1.0) # minimum positive value of a float
4.9406564584124654e-324
>>> minfloat(-1.0) # minimum negative value of a float
-4.9406564584124654e-324
But I couldn't stop there. Now I had to write a function to calculate the largest possible floating point value in Python, just for kicks:
>>> def maxfloat(guess = 1.0):
while(guess * 2 != guess):
guess = guess * 2
return guess
>>> maxfloat(+1.0) # maximum positive value of a float
inf
>>> maxfloat(-1.0) # maximum negative value of a float
-inf
This is interesting. Let's find out more about this "inf" value:
>>> inf
Traceback (most recent call last):
File "", line 1, in
inf
NameError: name 'inf' is not defined
>>> float("inf")
inf
>>> inf = maxfloat()
>>> inf + inf
inf
>>> inf - inf
nan
>>> 1 / inf
0.0
>>> 1/(-inf)
-0.0
Finally, check the relationship between minfloat and maxfloat:
>>> 1 / minfloat(1.0)
inf
>>> 1 / minfloat(-1.0)
-inf