Request for library to convert IEEE 754 to float value

General discussion on mikroBasic PRO for PIC32.
Post Reply
Author
Message
Stuartk
Posts: 54
Joined: 12 Jan 2013 04:17

Request for library to convert IEEE 754 to float value

#1 Post by Stuartk » 18 Jun 2017 23:32

Hello,

I'm looking to convert a 4 byte hex string in the IEEE 754 format to its floating point decimal value in MikroBasic.

Does anyone have a library function already made for this?

For example; 0x3E200000 would convert to 0.15625

I believe that MikroC has this functionality built in, but I can't find it in MikroBasic.

If no one has it, I'll have to put my thinking cap on.

Here are some pages that explain the complexities:

https://www.h-schmidt.net/FloatConverter/IEEE754.html
http://teaching.idallen.com/cst8281/10w ... rsions.txt
https://techdocs.altium.com/display/FPG ... wAodg80EaQ#

Regards to all,

Stuart

Stuartk
Posts: 54
Joined: 12 Jan 2013 04:17

Re: Request for library to convert IEEE 754 to float value

#2 Post by Stuartk » 03 Jul 2017 23:08

I've put the thinking cap on and constructed the function:

Calling the function with example: 0x3E200000 will return 0.15625

Code: Select all

Sub Function IEEE754_to_Extended(dim Byte3, Byte2, Byte1, Byte0 as byte) as Extended
  dim sign as short
  dim exponent as byte
  dim final_exp as integer
  dim value as byte[24]
  dim Mantissa as float
  dim Counter as byte
  
  'initialize
  Mantissa = 0
  
  'Calculate the sign
  sign = Byte3.B7       'bit 31 or bit 7 of byte3 is the sign
  if sign = 0 then      'strip the sign
   sign = 1
  else
   sign = -1
  end if
  
  'Calculate the exponent
  exponent = byte3 << 1   'bits 0-6 of byte3 become bits 1-7 of exponent
  exponent.B0 = byte2.B7  'bit 0 of exp is set to bit 7 of byte2
  final_exp = exponent - 127
  
  'Build the mantissa array
  value[23]=Byte0.B0  value[22]=Byte0.B1 value[21]=Byte0.B2 value[20]=Byte0.B3
  value[19]=Byte0.B4  value[18]=Byte0.B5 value[17]=Byte0.B6 value[16]=Byte0.B7
  
  value[15]=Byte1.B0 value[14]=Byte1.B1 value[13]=Byte1.B2 value[12]=Byte1.B3
  value[11]=Byte1.B4 value[10]=Byte1.B5 value[9]=Byte1.B6 value[8]=Byte1.B7
  
  value[7]=Byte2.B0 value[6]=Byte2.B1 value[5]=Byte2.B2 value[4]=Byte2.B3
  value[3]=Byte2.B4 value[2]=Byte2.B5 value[1]=Byte2.B6 value[0]=1
  
  'calculate the mantissa
   For Counter = 0 to 23
    if value[Counter] = 1 then
      Mantissa = Mantissa + pow(2, (Counter * -1))  'Sum all the points
    end if
   Next Counter

  'Calculate result = sign x (1 + mantissa) x 2^e   e= exponent-127
  Result = (pow(2, final_exp) * Mantissa) 'need to calculate 1 step a time otherwise generates error
  Result = (Result * sign)
end sub


Result=IEEE754_to_Extended(0x3E, 0x20, 0x00, 0x00) ' equals 0.15625


Regards,

Stuart

Post Reply

Return to “mikroBasic PRO for PIC32 General”