#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 вычисляется на хосте компилятора. Который может отличаться от целевого объекта компилятора.