I want to check whether a float is actually 32 or 64bits (and the number of bits of a numpy float array). There should be a built-in, but just didn't find out...
5 Answers
Properties of a Python float can be requested via sys.float_info. It returns information such as max/min value, max/min exp value, etc. These properties can potentially be used to calculate the byte size of a float. I never encountered anything else than 64 bit, though, on many different architectures.
The items of a NumPy array might have different size, but you can check their size in bytes by a.itemsize, where a is a NumPy array.
5 Comments
sys.float_info, but I wonder how that would ever be useful.)sys.float_info." vs. " The size in bits simply isn't exposed directly by Python". It's not your fault that Python doesn't expose the size in bits, but it's your fault that you're pretending to give a factual answer when really you're just waving your hand.sys.float_info, you can't determine the size of a float from there. It's straightforward enough if you're assuming the only options are IEEE754 binary32 and binary64, but if you're assuming that much, you might as well assume binary64 and not check at all. Of course, the in-memory size of the underlying C doubles doesn't mean that much when Python floats have so much object overhead attached, and NumPy dtypes take exactly the space they say they do (when packed in an array).numpy.finfo lists sizes and other attributes of float32 ..., including
nexp : number of bits in the exponent including its sign and bias.
nmant : number of bits in the mantissa.
On a machine with IEEE-754
standard floating point,
import numpy as np
for f in (np.float32, np.float64, float):
finfo = np.finfo(f)
print finfo.dtype, finfo.nexp, finfo.nmant
will print e.g.
float32 8 23
float64 11 52
float64 11 52
(Try float16 and float128 too.)
2 Comments
The range of floating point values is available in the sys.float_info object.
As Sven says, for CPython float is always 64-bit. But Python's language reference says
You are at the mercy of the underlying machine architecture (and C or Java implementation) for the accepted range ...".
So this is not necessarily the case for other Python implementations.
Comments
print numpy.finfo(numpy.float)
Machine parameters for float64
---------------------------------------------------------------------
precision= 15 resolution= 1.0000000000000001e-15
machep= -52 eps= 2.2204460492503131e-16
negep = -53 epsneg= 1.1102230246251565e-16
minexp= -1022 tiny= 2.2250738585072014e-308
maxexp= 1024 max= 1.7976931348623157e+308
nexp = 11 min= -max
---------------------------------------------------------------------