Есть ли способ создать функцию constexpr для получения битового представления double?

#c #c 11 #constexpr

#c #c 11 #constexpr

Вопрос:

Существует ли стандартный способ создания функции constexpr, которая позволяет преобразовать double в 64-битное представление:

 constexpr uint64_t double_to_uint64_t(double d) {
   ??????
}
 

Так что

 constexpr uint64_t two_bits = double_to_uint64_t(2.0);
 

будет ли компилироваться?

Обратный метод (uint64 для double) также представляет интерес.

Комментарии:

1. Меня интересуют только платформы, где double — это 64-разрядный тип с плавающей запятой IEEE-754.

2. Какое представление? То же значение? Аппаратное обеспечение компилятора? Аппаратное обеспечение целевой платформы?

3. Что именно вы подразумеваете под «его 64-битным представлением»?

4. Я хотел бы получить результат, эквивалентный memcpy(amp;bits, amp;d, sizeof(double)), где bits — это uint64_t, а d — это double .

Ответ №1:

Нет, пока C 20. Все обычные приемы либо прямо запрещены ( reinterpret_cast ), либо поведение undefined , и UB становится некорректным при выполнении во время компиляции.

C 20 предоставляет std::bit_cast , который выполняет двоичное преобразование между двумя типами, при условии, что они оба легко копируются и имеют одинаковый размер. И функция есть constexpr , так что вы можете использовать ее во время компиляции.

Комментарии:

1. Чтение double bytewise через указатель на char не является UB, равно как и копирование его в unsigned int . Однако выполнение этого constexpr…

2. @Yakk-AdamNevraumont: Одна большая проблема заключается в том, что constexpr вычисляется на хосте компилятора. Который может отличаться от целевого объекта компилятора.