2015-11-18 3 views
0

У меня есть этот код:Как преобразовать double в 64bit ieee754?

std::string GetBinary32(double value) 
{ 
union 
{ 
    float input; // assumes sizeof(float) == sizeof(int) 
    int output; 
} data; 

data.input = value; 

std::bitset<sizeof(float) * CHAR_BIT> bits(data.output); 

std::string mystring = bits.to_string<char, std::char_traits<char>, std::allocator<char> >(); 

return mystring; 
} 

Я хочу, чтобы получить 64 представление двойной.

Что мне нужно изменить?

+0

Вместо угадывания с помощью 'int' используйте' uint32_t'. Затем объедините 'double' с' uint64_t', чтобы получить 64-битную версию. В целом это не очень хорошая идея. Он блуждает в неопределенное поведение, так как вы одновременно используете разных членов союза. C++ не дает никаких гарантий, что это будет работать так, как ожидалось, или же во всех реализациях. Было бы безопаснее отказаться от объединения и 'memcpy'' input' для 'output'. – user4581301

ответ

0

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

С учетом того, что ваш компилятор использует IEE754 (это может быть проверено как упоминаемое here), вам нужно будет изменить свой союз на двойной и длинный. Длинный длинный будет на 32-битных и 64-битных машинах, представленных на 64 битах, как стандарт де-факто для окон и Unix (хотя стандарт C++ не применяет ничего по размеру, а только на диапазонах и порядке размера между char, int , длинные и т. д.).

И, конечно, адаптируйте переменную бит с sizeof (double).

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