Калькулятор для преобразования двоичного значения в число с плавающей точкой - что я делаю не так?
У меня есть следующий код, который записывает 6 поплавков на диск в двоичном виде и читает их обратно:
#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;
}
}
Это выводит:
0
0.23
0.46
0.69
0.92
1.15
0
0.23
0.46
0.69
0.92
1.15
Когда я загружаю файл в гексер, мы получаем:
00 00 00 00 1f 85 6b 3e 1f 85 eb 3e d7 a3 30 3f
1f 85 6b 3f 33 33 93 3f -- -- -- -- -- -- -- --
Я хочу, чтобы вычислить значение с плавающей запятой непосредственно из десятичного числа. Например: 1f 85 6b 3e
становится 0,23 и 1f 85 eb 3e
становится 0,46.
Я попробовал несколько калькуляторов "бинарный код" в сети. Когда я вставляю шестнадцатеричное представление числа, 0x1f856b3e
, в обоих калькуляторах я получаю обратно 5.650511E-20
. Но я подумал, что это значение должно быть 0,23, так как я предоставил калькулятору байты 5-8, и эти байты представляют собой второе число с плавающей запятой, записанное на диск.
Что я делаю неправильно?
1 ответ
Это проблема порядка байтов, если вы, например, переключитесь:
1f 85 6b 3e
чтобы:
3e 6b 85 1f
это приведет к .23
например, когда вы конвертируете его с помощью одного из ваших конвертеров, я использовал конвертер IEEE 754, а конвертер с плавающей запятой в шестнадцатеричный код позволяет вам выполнять преобразования с двойной или одинарной точностью.