2015-08-25 4 views
-3

Скажем, у меня есть метод профилирования, который возвращает значение uint64_t в шестнадцатеричном формате. Я хочу показать это значение в десятичном формате.Преобразование шестнадцатеричного числа в формате uint64_t в double в C++

Есть ли простой способ сделать это без использования стандартных библиотек C++? ожидаемый выход находится в диапазоне микросекунд. Образцовое значение, которое я получаю от профилировщика, - 0x9f0340.

+0

Вы пытаетесь переосмысливать биты, как двойной или просто преобразовать число в двойной? В вашем примере вы хотите, чтобы значение double имело значение 10421056.0? – mattnewport

+0

Преобразование числа в двойное. Я отредактирую вопрос. – Naveen

+1

'hexadecimal' - это строковый (ascii) формат. uint64_t - двоичный формат. Что у вас есть? –

ответ

0

использование static_cast

double val = static_cast<double>(executionTime); 

reinterpret_cast говорят 'эти биты там действительно двойной', но они не являются.

+0

Это дает ошибку, Ошибка: недействительный static_cast от типа 'uint64_t [4] {aka long unsigned int [4]}' для ввода 'double' – Naveen

+1

@Naveen: эта ошибка подразумевает что 'executeTime' представляет собой массив из 4 значений' uint64_t', а не одно значение. Какой элемент массива вам нужно преобразовать? –

+0

, который не соответствует его образцу :-( – pm100

-2

Предполагая, что вы пытаетесь переосмысливать биты, как двойной, полностью безопасный, портативный способ сделать это в C++ является использование memcpy:

uint64_t executionTime = profilerObj.getTime; //for example 0x9f0340 
double executionTimeAsDouble = 0.0; 
memcpy(&executionTimeAsDouble, &executionTime, sizeof(executionTimeAsDouble); 
cout << "Execution time is : " << executionTimeAsDouble; 
+0

, который собирается дать тот же ответ, что и reinterpet_cast – pm100

+0

@ pm100 Нет, он использует 'reinterpret_cast' неправильно, если это то, что он пытается выполнить, и даже если он использует его« правильно », это все равно будет небезопасным/неопределенным поведением. – mattnewport

+0

он работает, но он делает то же самое, что и реинтерпрет. Он этого не хочет, он хочет получить длинный двойник – pm100

3

Прежде всего, uint64_t сути не является шестнадцатеричной, восьмеричная, десятичная: это просто значение. Разве, может быть, есть еще одна кодировка его 64-битного значения?

Диапазон uint64_t не может превышать диапазон double, но при конвертации может быть некоторая потеря точности. Это связано с internal representation of a double, который использует в общей сложности 64 бит: 1 бит для знака, 11 для экспоненты и 53-54 для мантиссы. Напротив, значение uint64_t использует 64 бита.

Близкие временные метки, вероятно, имеют одинаковое значение double. Таким образом, вычитание одного из другого обеспечило бы разницу как uint64, но ноль как двойной.

Обычный метод для преобразования из одного в другой в с отлично работает в C++ тоже:

uint64_t val64 = 892749724729742uL; 
double d = val64; 
+0

В зависимости от уровней компилятора и предупреждения вы можете получить предупреждение о возможной потере данные без явного приведения ('static_cast' или C-style cast) из' uint64_t' в 'double' – mattnewport

Смежные вопросы