如何在constexpr C ++代码中将int加倍为int64?

时间:2018-05-14 00:58:01

标签: c++ floating-point constexpr bits int64

有没有办法在C ++的constexpr函数中将double的位作为int64_t?

我首先尝试了通常的*reinterpret_cast<int64_t*>(&d),但这在constexpr代码中是不允许的,这是有道理的。然后,我尝试了通常的回退,(通常会导致代码速度变慢,不幸的是它在运行时运行,而不是编译时),创建一个具有double和int64_t联合的结构,并使用constexpr构造函数一个double来初始化double成员。构造函数被接受,我有其他的情况,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'
海湾合作委员会抱怨:

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

不能做到这一点是相当不幸的,特别是因为我正在实现一个高精度的浮点类,需要访问这些位,我希望几乎所有的函数都能够运行在编译时(如果适用)。有没有人有任何变通方法不会导致运行时案例的运行时性能极慢?

(PS请不要忽略这个问题,只回复一些类似“标准不能保证双重是64位或者int64_t是64位”的东西,因为我真的不关心那些从来没有过的东西在StackOverflow上似乎有很多那种嘲讽。我关心的每个平台上关心的每个编译器都会有这种保证,否则我会停止使用它们。我会很感激实际代码的实际帮助,拜托。谢谢。)

0 个答案:

没有答案