Шестнадцатеричная константа с плавающей точкой - PullRequest
2 голосов
/ 12 октября 2011

В следующей программе на C использование шестнадцатеричных констант с плавающей точкой демонстрирует

double d;
d = 2;
 printf("Ex 1: 2 in hex: %a\n\n",d);

 d = 256;
 printf("Ex 2: 2^8 in hex: %a\n\n",d);

 d = 0.015625; //= 2^-6
 printf("Ex 3: 2^-6 in hex: %a\n\n",d);

 d = 0.857421875;
 printf("Ex 4: 0.857421875 in hex: %a\n\n",d);

результаты:

Ex 1: 2 in hex: 0x1p+1

Ex 2: 2^8 in hex: 0x1p+8

Ex 3: 2^-6 in hex: 0x1p-6

Ex 4: 0.857421875 in hex: 0x1.b7p-1

Я не понимаю, как получить результатнапример 4?

1 Ответ

6 голосов
/ 12 октября 2011

Мантисса в числе с плавающей запятой обычно представлена ​​числом, большим или равным 1, но меньшим 2. Это точно равно 1 во всех примерах, кроме последнего.

Итак, что выделать с последним?Повторно представьте 0,857421875 как 0,857421875 * 2/2, то есть 1,71484375 * 2 -1 .Теперь вы хотите мантиссу в гексе.Double имеет 53 бита в мантиссе (включая подразумеваемый 1.), поэтому 1.71484375 в этих 52 (53) битах фактически представляется как целое число, равное 1.71484375 * 2 52 = 7722969673498624 = 0x1B700000000000.Итак, вот оно, 0x1.b7p-1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...