Как double 5.2 представлен в двоичном файле? - PullRequest
0 голосов
/ 12 февраля 2019

Например, данная программа

FILE *f = fopen("test.txt","w");
double d = 5.2;
fwrite(&d, sizeof(typeof(d)), 1, f);
fclose(f);

, когда я использую xxd для просмотра содержимого, я получаю

//binary
0000000: 11001101 11001100 11001100 11001100 11001100 11001100  ......
0000006: 00010100 01000000                                      .@
//hex
0000000: cdcc cccc cccc 1440                      .......@

, но я нашла Как представить число FLOAT в памяти вC чтобы он выглядел как

0 10000001 01001100110011001100110

, поэтому я не уверен, что это тот же двоичный файл в памяти и файле, или я совершенно не прав.Как определить значение с плавающей запятой из данного примера?

Спасибо

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Если вы хотите узнать, как конкретно 32-битное значение с плавающей точкой относится к 64-битному значению с плавающей точкой, вы можете увидеть совпадение элементов знакового бита, мантиссы и экспоненты.

//Your double in little endian
11001101 11001100 11001100 11001100 11001100 11001100 00010100 01000000    

//for better readability in big endian
01000000 00010100 11001100 11001100 11001100 11001100 11001100 11001101 

//the 32-bit float from the answer you linked
01000000 10100110 01100110 01100110

//1 bit sign  8/11-bit exponent   23/52-bit mantissa
0             10000000 001      01001100 11001100 11001100 11001100 11001100 11001100 1101
0             10000001          01001100 11001100 1100110

Почемузначение показателя степени и мантиссы - это то, как они объясняются лучше в ответе, который вы связали, и в другом месте, чем я мог бы сделать из макушки головы

0 голосов
/ 12 февраля 2019

Битовый массив, который вы показываете, 0 10000001 01001100110011001100110, предназначен для базового 32-битного двоичного представления IEEE-754 с плавающей запятой, часто используемого для float.Вы запрашиваете представление double, которое часто использует базовый 64-разрядный двоичный код IEEE-754.

Показанные вами байты cdcc cccc cccc 1440 представляют собой представление 5.2 в порядке с прямым порядком байтов.В старшем байте первый бит в позиции 0x80 равен нулю.Это знаковый бит, а ноль означает положительный.Следующие семь битов 0x40 и четыре байта от следующего байта 1 из 0x14 являются показателем степени.Вместе они 0x401.Экспонента смещена на 0x3ff.Таким образом, с показателем степени, закодированным как 0x401, фактический показатель степени равен 2, что означает 2 2 .

Остальные биты кодируют значение и.Они 0x4cccccccccccd.Для нормальных чисел значение33 ставится после «радикальной точки» (общего эквивалента десятичной точки) с 1 перед точкой: 1,4cccccccccccd 16 .В десятичной системе, то есть примерно 1,3 (точно 1.3000000000000000444089209850062616169452667236328125). * * * Тысяча двадцать один тысяча двадцать два * вместе, значение равно + 2 * 2 * тысяча двадцать-три • 1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568394002504646778106689453125.

...