有没有办法在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上似乎有很多那种嘲讽。我关心的每个平台上关心的每个编译器都会有这种保证,否则我会停止使用它们。我会很感激实际代码的实际帮助,拜托。谢谢。)