converting 64-bit fixed-point to float

John Fisher johnmfisher at comcast.net
Sat Jul 21 02:59:30 CEST 2007


Hi Group,

troubles with converting signed 32.32, little-endian, 2's complement
back to floating point. I have been trying to brew it myself. I am
running Python 2.5 on a Mac. Here is the C-code I have been trying to
leverage:

 double FPuint8ArrayToFPDouble(uint8 *buffer, int startIndex) 
{ 
  uint32 resultDec = 0;
  uint32 resultWh = 0;
  int i;

  for(i = 0; i < 4; i++)
  {
    resultDec += (uint32)buffer[startIndex + i] * pow(2, (i*8));
    resultWh += (uint32)buffer[startIndex + i + 4] * pow(2, (i*8));
  }

  return ( (double)((int)resultWh) + (double)(resultDec)/4294967296.0 );
}


Here is my version in Python, with some test code built in:

from ctypes import *

def conv64(input):
    input1=[0]*8
    input1[0]=c_ushort(input[0])
    input1[1]=c_ushort(input[1])
    input1[2]=c_ushort(input[2])
    input1[3]=c_ushort(input[3])
    input1[4]=c_ushort(input[4])
    input1[5]=c_ushort(input[5])
    input1[6]=c_ushort(input[6])
    input1[7]=c_ushort(input[7])
    #print input1[0].value,
input1[1].value,input1[2].value,input1[3].value
    #print
input1[4].value,input1[5].value,input1[6].value,input1[7].value
    #print 
    resultDec=c_ulong(0)
    resultWh=c_ulong(0)
    for i in range(4):
        dec_c=c_ulong(input1[i].value)
        Wh_c=c_ulong(input1[i+4].value)
        resultDec.value=resultDec.value+dec_c.value*2**(i*8)
        resultWh.value=resultWh.value+Wh_c.value*2**(i*8)
   conval=float(int(resultWh.value))+float(resultDec.value)/4294967296.0
    #print conval
    return conval
#tabs got messed up bringing this into MacSoup

#these are 64-bit fixed point format (signed 32.32, little-endian, 2's
complement)
#should be -1
conv64_0=[0, 0, 0, 255, 255, 255, 255, 255]
#should be 0
conv64_1=[0, 0, 0, 0, 0, 0, 0, 0]
#should be 0.20000
conv64_1_2=[51, 51, 51, 51, 0, 0, 0, 0]
#should be 1
conv64_2=[0, 0, 0, 0, 1, 0, 0, 0]
#should be 2
conv64_3=[0, 0, 0, 0, 2, 0, 0, 0]
#should be 298.15
conv64_4=[102, 102, 102, 38, 42, 1, 0, 0]
#should be -0.2
conv64_5=[205,204,204,204,255,255,255,255]
output0=conv64(conv64_0)
print "output should be -1 is "+str(output0)
output1=conv64(conv64_1)
print "output should be 0 is "+str(output1)
output1_2=conv64(conv64_1_2)
print "output should be 0.2 is "+str(output1_2)
output2=conv64(conv64_2)
print "output should be 1 is "+str(output2)
output3=conv64(conv64_3)
print "output should be 2 is "+str(output3)
output4=conv64(conv64_4)
print "output should be 298.15 is "+str(output4)
output5=conv64(conv64_5)
print "output should be -0.2 is "+str(output5)



Finally, here is the output I get from my code:

>>> 
output should be -1 is 4294967296.0
output should be 0 is 0.0
output should be 0.2 is 0.199999999953
output should be 1 is 1.0
output should be 2 is 2.0
output should be 298.15 is 298.15
output should be -0.2 is 4294967295.8

Thanks for any light you can shed on my ignorance.

wave_man



More information about the Python-list mailing list