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?
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With