# Binary representation of floating point numbers

Bengt Richter bokr at oz.net
Wed Dec 7 03:25:00 CET 2005

```On Tue, 06 Dec 2005 22:51:03 -0000, Grant Edwards <grante at visi.com> wrote:

>On 2005-12-06, 63q2o4i02 at sneakemail.com <63q2o4i02 at sneakemail.com> wrote:
>
>> The only way to get the flags is as a float, either through an
>> ascii string or a true float.
>
>That's perverse.
>
>Really.
>
>Somebody needs to be slapped.
>
>> The value of the float, however, is representable as 24 bits
>> of normal binary.
>
>OK, that should preserve a 1:1 mapping between strings/floats
>and flag bit patterns.  It's still sick, though.
>
>> So for example, the value returned is +4.608400E+04 which is
>> really an int, 46084, which is more easily convertible to
>> binary.
>
>You really don't need to convert it to "binary".  Just convert
>it to an integer object.
>
>> So the question becomes how to convert an int to binary, which
>> I found here
>>
>
>I doubt you actually want to do that.  Just leave it as an
>integer, and test for the bits you care about:
>
>def bit(n):
>   return 1<<n
>
>flags = int(half_assed_float_representing_the_flag_values)
>
>if flags & bit(0):
>    print "underrange"
>if flags & bit(1):
>    print "overrange"
>if flags & bit(19):
>    print "bit 19 is set but nobody can hear me scream"
>if flags & bit(23):
>    callThePolice()
>
>or whatever.
>
You could also make a "whatever" like

>>> class Bitview(long):
...     def __new__(cls, v, width=32):
...         inst = long.__new__(cls, v)
...         inst.width = width
...         return inst
...     def __getitem__(self, i):
...         if isinstance(i, slice): return list(self)[i]
...         if i>=self.width or i+self.width<0:
...             raise IndexError, '%r has only %r bits' %(long(self), self.width)
...         if i<0: i = i + self.width
...         bit = 1<<i
...         return self&bit and 1 or 0
...     def __repr__(self): return "Bitview(int('%s', 2))"% str(self)
...     def __str__(self): return ''.join(map(str, self))[::-1]
...
>>> bv11 = Bitview(11, 8)
>>> bv11
Bitview(int('00001011', 2))
>>> bv11[8]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 9, in __getitem__
IndexError: 11L has only 8 bits
>>> list(bv11)
[1, 1, 0, 1, 0, 0, 0, 0]
>>> bv11[::-1]
[0, 0, 0, 0, 1, 0, 1, 1]
>>> bv11[-1]
0
>>> bv11[-5]
1
>>> bv11[-6]
0
>>> bv11[:4]
[1, 1, 0, 1]
>>> str(bv11)
'00001011'
>>> repr(bv11)
"Bitview(int('00001011', 2))"
>>> eval(repr(bv11)) == bv11
True
>>> import sys
>>> Bitview(sys.maxint)
Bitview(int('01111111111111111111111111111111', 2))