Как получить double как int64 в коде constexpr C ++? - PullRequest
0 голосов
/ 14 мая 2018

Есть ли способ получить биты типа double как int64_t в функции constexpr в C ++?

Сначала я попробовал обычный *reinterpret_cast<int64_t*>(&d), но это не разрешено в коде constexpr, что имеет некоторый смысл. Затем я попробовал обычный запасной вариант (который обычно приводит к более медленному коду, к сожалению, для случаев, когда он выполняется во время выполнения, а не во время компиляции), для создания структуры с объединением double и int64_t с конструктором constexpr, который принимает двойной для инициализации двойного члена. Конструктор принят, и у меня были другие случаи, когда код constexpr в порядке с объединениями в структурах, но если какой-либо код пытается прочитать член объединения int64_t, Visual Studio 2017 жалуется:

error C2131: expression did not evaluate to a constant
note: failure was caused by accessing a non-active member of a union
note: see usage of 'big_float::DoubleInt::i'

GCC жалуется:

error: accessing 'DoubleInt::<unnamed union>::i' member instead of initialized 'DoubleInt::<unnamed union>::d' member in constant expression

Весьма прискорбно, что я не могу этого сделать, особенно потому, что я реализую высокоточный класс с плавающей запятой, требующий доступа к битам, и мне бы хотелось, чтобы почти все функции могли выполняться во время компиляции, если применимо. У кого-нибудь есть обходные пути, которые не приведут к крайне медленной производительности во время выполнения?

(PS Пожалуйста, не игнорируйте вопрос, а отвечайте только с каким-то странным видом, вроде «стандарт не гарантирует, что double равен 64 битам, а int64_t - 64 битам», потому что меня действительно не волнуют вещи, которые никогда Кажется, что в StackOverflow очень много такого рода ухищрений. Каждый компилятор, который мне небезразличен на каждой платформе, о которой я забочусь, всегда будет иметь такую ​​гарантию, иначе я перестану их использовать. Я был бы признателен за реальную помощь для реального кода. Пожалуйста. Спасибо.)

...