Преобразовать двоичные данные целого числа в плавающее - PullRequest
1 голос
/ 26 сентября 2019

Допустим, у меня есть целое число:

unsigned long long int data = 4599331010119547059;

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

Как это сделать в C ++?Я видел некоторые методы, использующие Union, но многие не рекомендовали использовать этот подход.

Ответы [ 3 ]

4 голосов
/ 26 сентября 2019

Начиная с C ++ 20, вы можете использовать std::bit_cast:

std::bit_cast<double>(data)

До C ++ 20 вы можете использовать std::memcpy:

double d;
static_assert(sizeof d == sizeof data);
std::memcpy(&d, &data, sizeof d);

Обратите внимание, чторезультат будет варьироваться в зависимости от представления с плавающей запятой (хотя IEEE-754 является вездесущим), а также от того, имеют ли типы с плавающей запятой и целочисленные значения одинаковые порядковые номера.

3 голосов
/ 26 сентября 2019

Если взять вопрос по его номинальной стоимости (если у вас есть веская причина для этого!), Это единственный правильный способ сделать это в текущем стандарте C ++:

int i = get_int(); 
float x;
static_assert(sizeof(float) == sizeof(int), "!!!");
memcpy(&x, &i, sizeof(x));
0 голосов
/ 26 сентября 2019

Вы можете использовать reinterpret_cast:

float f = reinterpret_cast<float&>(data);

Для вашей ценности я не получу 0,314 ... но вот как вы могли бы это сделать.

...