msbin to ieee

revuesbio revuesbio at gmail.com
Mon May 7 09:37:55 EDT 2007


On 7 mai, 14:56, John Machin <sjmac... at lexicon.net> wrote:
> On May 7, 10:00 pm, revuesbio <revues... at gmail.com> wrote:
>
>
>
> > On 7 mai, 13:21, John Machin <sjmac... at lexicon.net> wrote:
>
> > > On May 7, 6:18 pm, revuesbio <revues... at gmail.com> wrote:
>
> > > > On 7 mai, 03:52, John Machin <sjmac... at lexicon.net> wrote:
>
> > > > > On May 7, 7:44 am, revuesbio <revues... at gmail.com> wrote:
>
> > > > > > Hi
> > > > > > Does anyone have the python version of the conversion from msbin to
> > > > > > ieee?
> > > > > > Thank u
>
> > > > > Yes, Google has it. Google is your friend. Ask Google. It will lead
> > > > > you to such as:
>
> > > > >http://mail.python.org/pipermail/python-list/2005-August/337817.html
>
> > > > > HTH,
> > > > > John
>
> > > > Thank you,
>
> > > > I've already read it but the problem is always present. this script is
> > > > for double precision MBF format ( 8 bytes).
>
> > > It would have been somewhat more helpful had you said what you had
> > > done so far,  even posted your code ...
>
> > > > I try to adapt this script for single precision MBF format ( 4 bytes)
> > > > but i don't find the right float value.
>
> > > > for example : 'P\xad\x02\x95' will return '0.00024924660101532936'
>
> > > If you know what the *correct* value is, you might like to consider
> > > shifting left by log2(correct_value/erroneous_value) :-)
>
> > > Do you have any known correct pairs of (mbf4 string, decimal_float
> > > value)? My attempt is below -- this is based on a couple of
> > > descriptive sources that my friend Google found, with no test data. I
> > > believe the correct answer for the above input is 1070506.0 i.e. you
> > > are out by a factor of 2 ** 32
>
> > > def mbf4_as_float(s):
> > >     m0, m1, m2, m3 = [ord(c) for c in s]
> > >     exponent = m3
> > >     if not exponent:
> > >         return 0.0
> > >     sign = m2 & 0x80
> > >     m2 |= 0x80
> > >     mant = (((m2 << 8) | m1) << 8) | m0
> > >     adj = 24 + 128
> > >     num = mant * 2.0 ** (exponent - adj)
> > >     if sign:
> > >         return -num
> > >     return num
>
> > > HTH,
> > > John
>
> > well done ! it's exactly what i'm waiting for !!
>
> > my code was:>>> from struct import *
> > >>> x = list(unpack('BBBB','P\xad\x02\x95'))
> > >>> x
> > [80, 173, 2, 149]
> > >>> def conversion1(bytes):
>
> > b=bytes[:]
> > sign = bytes[-2] & 0x80
> > b[-2] |= 0x80
> > exp = bytes[-1] - 0x80 - 56
> > acc = 0L
> > for i,byte in enumerate(b[:-1]):
> > acc |= (long(byte)<<(i*8))
> > return (float(acc)*2.0**exp)*((1.,-1.)[sign!=0])
>
> Apart from the 2**32 problem, the above doesn't handle *any* of the
> 2**24 different representations of zero. Try feeding \0\0\0\0' to it
> and see what you get.
>
>
>
> > >>> conversion1(x)
>
> > 0.00024924660101532936
>
> > this script come from google groups but i don't understand bit-string
> > manipulation (I'm a  newbie). informations about bit-string
> > manipulation with python is too poor on the net.
>
> The basic operations (and, or, exclusive-or, shift) are not specific
> to any language. Several  languages share the same notation (& | ^ <<
>
> >>), having inherited it from C.
>
> > thank you very much for your script.
>
> Don't thank me, publish some known correct pairs of values so that we
> can verify that it's not just accidentally correct for 1 pair of
> values.

pairs of values :
(bytes string, mbf4_as_float(s) result)                        right
float value
('P\xad\x02\x95', 1070506.0)
1070506.0
('\x00\x00\x00\x02', 5.8774717541114375e-039)         0.0
('\x00\x00\x00\x81', 1.0)
1.0
('\x00\x00\x00\x82', 2.0)
2.0
('\x00\x00@\x82', 3.0)
3.0
('\x00\x00\x00\x83', 4.0)
4.0
('\x00\x00 \x83', 5.0)
5.0
('\xcd\xcc\x0c\x81', 1.1000000238418579)                 1.1
('\xcd\xcc\x0c\x82', 2.2000000476837158)                  2.2
('33S\x82', 3.2999999523162842)                              3.3
('\xcd\xcc\x0c\x83', 4.4000000953674316)                  4.4
('\x00\x00z\x8a', 1000.0)
1000.0




More information about the Python-list mailing list