52

What are its smallest and biggest values in python?

1

6 Answers 6

97
>>> import sys >>> sys.float_info sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1) 

The smallest is sys.float_info.min (2.2250738585072014e-308) and the biggest is sys.float_info.max (1.7976931348623157e+308). See documentation for other properties.

sys.float_info.min is the normalized min. You can usually get the denormalized min as sys.float_info.min * sys.float_info.epsilon. Note that such numbers are represented with a loss of precision. As expected, the denormalized min is less than the normalized min.

Sign up to request clarification or add additional context in comments.

4 Comments

What is "normalized" min?
Normalized floating number starts with leftmost bit of mantissa set
I think it's better explained by the exponent part in double precision format. Here, the subnormal numbers have all bits set to 0, see Wikipedia for examples.
The smallest float you can get is actually negative not sys.float_info.min which is smallest positive "normalized" value you can get to 0.
17

See this post.

Relevant parts of the post:

 In [2]: import kinds In [3]: kinds.default_float_kind.M kinds.default_float_kind.MAX kinds.default_float_kind.MIN kinds.default_float_kind.MAX_10_EXP kinds.default_float_kind.MIN_10_EXP kinds.default_float_kind.MAX_EXP kinds.default_float_kind.MIN_EXP In [3]: kinds.default_float_kind.MIN Out[3]: 2.2250738585072014e-308 

1 Comment

Note that Numeric has been largely superseded by NumPy. I wonder if a more modern equivalent of the kinds modules exists, though…
9

As a kind of theoretical complement to the previous answers, I would like to mention that the "magic" value ±308 comes directly from the binary representation of floats. Double precision floats are of the form ±c*2**q with a "small" fractional value c (~1), and q an integer written with 11 binary digits (including 1 bit for its sign). The fact that 2**(2**10-1) has 308 (decimal) digits explains the appearance of 10**±308 in the extreme float values.

Calculation in Python:

>>> print len(repr(2**(2**10-1)).rstrip('L')) 308 

Comments

7

Technically speaking, the smallest float is -inf and the max float inf:

>>> (float('-inf') # negative infinity < -1.7976931348623157e+308 #* smallest float that is not negative infinity < -4.9406564584124654e-324 #* biggest negative float that is not zero < 0 # zero duh < 4.9406564584124654e-324 #* smallest positive float that is not zero < 1.7976931348623157e+308 #* biggest float that is not positive infinity < float('inf')) # positive infinity True 

numbers with * are machine-dependent and implementation-dependent.

3 Comments

How did you get 4.9406564584124654e-324? To me, it seems not like a normalized number, so I would rather go with 2.2250738585072014e-308 which is documented by sys.float_info.min.
The smallest positive number is 2**(-52) * 2**(-1022) as per IEEE-754 double precision floats subnormal numbers
You can actually run the code I gave above it will show you that 4.9406564584124654e-324 is greater than 0
7

Python uses double-precision floats, which can hold values from about 10 to the -308 to 10 to the 308 power.

http://en.wikipedia.org/wiki/Double_precision_floating-point_format

Try this experiment from the Python prompt:

>>> 1e308 1e+308 >>> 1e309 inf 

10 to the 309 power is an overflow, but 10 to the 308 is not. QED.

Actually, you can probably get numbers smaller than 1e-308 via denormals, but there is a significant performance hit to this. I found that Python is able to handle 1e-324 but underflows on 1e-325 and returns 0.0 as the value.

2 Comments

And how's 1e+308 supposed to be bigger (see question) than infinity? ;)
@sfussenegger: The answer "-inf and +inf" is certainly a valid response to the question. Please post it as a separate answer.
3

Just playing around; here is an algorithmic method to find the minimum and maximum positive float, hopefully in any python implementation where float("+inf") is acceptable:

def find_float_limits(): """Return a tuple of min, max positive numbers representable by the platform's float""" # first, make sure a float's a float if 1.0/10*10 == 10.0: raise RuntimeError("Your platform's floats aren't") minimum= maximum= 1.0 infinity= float("+inf") # first find minimum last_minimum= 2*minimum while last_minimum > minimum > 0: last_minimum= minimum minimum*= 0.5 # now find maximum operands= [] while maximum < infinity: operands.append(maximum) try: maximum*= 2 except OverflowError: break last_maximum= maximum= 0 while operands and maximum < infinity: last_maximum= maximum maximum+= operands.pop() return last_minimum, last_maximum if __name__ == "__main__": print (find_float_limits()) # python 2 and 3 friendly 

In my case,

$ python so1835787.py (4.9406564584124654e-324, 1.7976931348623157e+308) 

so denormals are used.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.