On May 7, 10:00 pm, revuesbio <[EMAIL PROTECTED]> wrote: > On 7 mai, 13:21, John Machin <[EMAIL PROTECTED]> wrote: > > > > > On May 7, 6:18 pm, revuesbio <[EMAIL PROTECTED]> wrote: > > > > On 7 mai, 03:52, John Machin <[EMAIL PROTECTED]> wrote: > > > > > On May 7, 7:44 am, revuesbio <[EMAIL PROTECTED]> 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. -- http://mail.python.org/mailman/listinfo/python-list