C / C ++ инициализировать двойной с шестнадцатеричным

Я хочу инициализировать двойной с шестнадцатеричной константой.

double dbl = 0xFEDCBA9876543212;
printf("dbl: %llX\n", (uint64_t)dbl);

Я ожидаю увидеть в качестве вывода:

dbl: FEDCBA9876543212

Но я получаю:

dbl: FEDCBA9876543000

Почему это так и почему последние 3 байта сбрасываются?

0

Решение

Если вы просто хотите выполнить транзакцию в стиле memcpy, вы можете попробовать:

uint64_t x = 0xFEDCBA9876543212;
double dbl = *reinterpret_cast<double *>(&x);

Кроме того, ваш тест может не выполнять то, что вы хотите:

Мой тест:

#include <cstdint>
#include <cstdio>

int main (void) {
// Move the underlying hex value through multiple types
uint64_t x = 0xFEDCBA9876543212;
double dbl = *reinterpret_cast<double *>(&x);
uint64_t y = *reinterpret_cast<uint64_t *>(&dbl);

// Check integrity of the result
printf("dbl: %llX\n", (uint64_t)dbl);  //your test
printf("x: %llx\ny: %llx\n", x, y);  //my test

return 0;
}

Выход:

dbl: 8000000000000000
x: fedcba9876543212
y: fedcba9876543212

Как видите, лежащее в основе двоичное значение остается тем же, что и от x в dbl в y, хотя ваш текущий тест printf("dbl: %llX\n", (uint64_t)dbl); производит неожиданный вывод.

1

Другие решения

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

4

double точность 53 бита, вот почему вы получаете нули на оставшиеся позиции.

1

Если вы хотите точно знать значение вашего двойника, используйте шестнадцатеричный формат двойных чисел:

0x1.01234567898abcp-12

а затем напечатайте номер с printf("%p", number); как только вы собрали номер на другом конце. Номер должен соответствовать вводу, если у вас есть правильное количество цифр.

1
По вопросам рекламы [email protected]