Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculator to convert binary to float value -- what am I doing wrong?

I have the following code, which writes 6 floats to disk in binary form and reads them back:

#include <iostream>
#include <cstdio>

int main()
{
  int numSegs = 2;
  int numVars = 3;

  float * data = new float[numSegs * numVars];
  for (int i = 0; i < numVars * numSegs; ++i) {
    data[i] = i * .23;
    std::cout << data[i] << std::endl;
  }

  FILE * handle = std::fopen("./sandbox.out", "wb");

  long elementsWritten = 
    std::fwrite(data, sizeof(float), numVars*numSegs, handle);

    if (elementsWritten != numVars*numSegs){
      std::cout << "Error" << std::endl;
    }

    fclose(handle);
    handle = fopen("./sandbox.out", "rb");

    float * read = new float[numSegs * numVars];

    fseek(handle, 0, SEEK_SET);

    fread(read, sizeof(float), numSegs*numVars, handle);

    for (int i = 0; i < numVars * numSegs; ++i) {
      std::cout << read[i] << std::endl;
    }
}

It outputs:

0
0.23
0.46
0.69
0.92
1.15
0
0.23
0.46
0.69
0.92
1.15

When I load the file in a hexer, we get:

00 00 00 00 1f 85 6b 3e  1f 85 eb 3e d7 a3 30 3f
1f 85 6b 3f 33 33 93 3f  -- -- -- -- -- -- -- --

I want to be calculate the float value from the decimal directly. For example: 1f 85 6b 3e becomes 0.23 and 1f 85 eb 3e becomes 0.46.

I've tried a few "binary to float" calculators on the web. When I put in the hexadecimal representation of the number, 0x1f856b3e, in both calculators I get back 5.650511E-20 . But I thought the value should be 0.23 since I provided bytes 5-8 to the calculator and these bytes represent the second float written to disk.

What am I doing wrong?

like image 987
Walt Dizzy Records Avatar asked Mar 21 '14 19:03

Walt Dizzy Records


People also ask

What will happen if you cast a float to an integer?

Casting a float to an integer truncates the value, so if you have 3.999998 , and you cast it to an integer , you get 3 . The way to prevent this is to round the result.

How are floating point numbers stored?

Scalars of type float are stored using four bytes (32-bits). The format used follows the IEEE-754 standard. The mantissa represents the actual binary digits of the floating-point number.


1 Answers

This is an endianness issue if you for example switch:

1f 85 6b 3e 

to:

3e 6b 85 1f

this will result in .23 when you convert it using one of your converters, for example I used IEEE 754 Converter and Floating Point to Hex Converter allows you to do double as well as single precision conversions.

like image 181
Shafik Yaghmour Avatar answered Oct 17 '22 21:10

Shafik Yaghmour