【发布时间】:2016-07-22 05:36:20
【问题描述】:
我们有像 std::nanl 这样的特殊函数来制作带有有效负载的 NaN。目前这是我必须做的才能将其打印回来:
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdint>
int main()
{
const auto x=std::nanl("1311768467463790325");
std::uint64_t y;
std::memcpy(&y,&x,sizeof y);
std::cout << (y&~(3ull<<62)) << "\n";
}
这依赖于long double 的特定表示,即它是 80 位类型的 x87 FPU。是否有任何标准方法可以在不依赖此类实现细节的情况下实现这一目标?
【问题讨论】:
-
没有。浮点类型的表示——包括对 NaN 的任何支持——是实现定义的。并非所有浮点表示都可以支持 NaN。因此,从 C++ 实现的角度来看,不能保证 NaN 完全可以表示,并且不能保证 - 如果可以的话 - 将如何表示。