Извлечение байтового значения double из памяти - PullRequest
3 голосов
/ 07 января 2012

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

В идеале я хочу иметь возможность извлечь знак, показатель степени и мантиссу из числа (стандарт IEEE 754)

Из того, что я понимаю, приведение к неподписанному символу - это путь.У меня есть следующий фрагмент кода (украденный в другом месте), но я не доверяю результатам - нет байтов для любых целочисленных значений:

double d = 2;
unsigned char *p = (unsigned char*)&d;

Может ли кто-нибудь направить меня в правильном направлении, чтобы извлечьБайтное представление двойных чисел точно, или дать какие-либо советы / комментарии о том, как действовать?

Ответы [ 2 ]

5 голосов
/ 07 января 2012

Вы делаете это правильно. Теперь вы можете обрабатывать p как массив unsigned char[sizeof(double)].

Например:

for (int i = 0; i != sizeof(double); ++i)  printf("%02X ", p[i]);

Для d = 0.125 печатается 00 00 00 00 00 00 C0 3F. Обратный порядок и разложение на части, это:

00111111 11000000 0 0 0 0 0 0
   3F       C0    0 0 0 0 0 0

0   01111111100   0...<52 times>...0
S     Exponent         Mantissa
+     1023 - 3           1.0

Значение поля экспоненты равно 1020, что дает показатель степени минус 3 после исправления смещением 1023, а мантисса равна 1,0 после включения неявного ведущего 1. Таким образом, значение равно 2 & минус; 3 = 1 / 8.

3 голосов
/ 07 января 2012

Если ваша мотивация только точность, используйте printf("%a\n", d);

Он отображает ту же информацию, что и при переходе в двоичное представление, но отображает ее в формате, который почти удобочитаем. Здесь (то есть для d=2;) отображается 0x1p+1. Число после 0x - это мантисса, нормализованная от 1 до 2 и в шестнадцатеричном формате. Число после p является показателем степени. Отображается в десятичном виде, но представляет степень двойки.

...