Интерпретировать двойной написано как шестнадцатеричный - PullRequest
0 голосов
/ 16 января 2019

Я работаю с двойными (64-битными), хранящимися в файле, печатая необработанные байты из представления C #. Например, десятичное число 0,95238095238095233 хранится в виде байтов «9e e7 79 9e e7 79 ee 3f» в шестнадцатеричном формате. Все работает как положено, я могу писать и читать, но я бы хотел сам понять это представление о двойнике.

Согласно документации C # https://docs.microsoft.com/en-us/dotnet/api/system.double?view=netframework-4.7.2#explicit-interface-implementations и википедии https://en.wikipedia.org/wiki/Double-precision_floating-point_format первый бит предположительно является знаком с 0 для положительного и 1 для отрицательного числа. Однако, независимо от того, в каком направлении я читаю свои байты, первый бит равен 1. Либо 9 = 1001, либо f = 1111. Я озадачен, поскольку 0,95 ... положительно.

В качестве двойной проверки следующий код Python также возвращает правильное десятичное число. unpack('d', binascii.unhexlify("9ee7799ee779ee3f"))

Может кто-нибудь объяснить, как человек может прочитать эти байты и получить 0,95238095238095233?

1 Ответ

0 голосов
/ 18 января 2019

Разобрался, набор байтов читается как 64-битное число (первый бит слева), но каждый байт читается как строка (первый бит справа).Таким образом, мои байты должны читаться сначала «3F», 3F - слева направо, поэтому я начинаю с битов 0011 1111 и т. Д. Это дает кодирование IEEE 754, как и ожидалось: первый бит - знак, следующие 11 бит - показатель степени,а затем дробь.

...