【问题标题】:How to print payload of a NaN?如何打印 NaN 的有效载荷?
【发布时间】: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 完全可以表示,并且不能保证 - 如果可以的话 - 将如何表示。

标签: c++ nan


【解决方案1】:

C++ 从 ISO C 导入 nan* 函数。ISO C 在 7.22.1.3 中声明:

n-char 序列的含义是实现定义的

有评论

实现可以使用 n-char 序列来确定要在 NaN 的有效数字中表示的额外信息。

没有办法获取存储的信息。

【讨论】:

  • 你会如何使用 frexp?例如,Glibc 记录了对于 NaN,它返回一个 NaN...
  • @MarcGlisse 抱歉,我检查了 ISO C++ 文档,没有说明它不返回 NaN 的有效数字。在 ISO C 中,它也为 NaN 返回 NaN。那就没有办法得到了。
  • @StenSoft 在 ISO C 中,截至您回答时,有一种方法可以使用 TS 18661-1:2014 中定义的 getpayload() 来获得 NaN 的重要意义,旨在放入C2x 并且已经是 glibc 的一部分。相应的操作将在 IEEE 754-2019 中描述为getPayload。
  • @MingyeWang 这听起来像是一个潜在的答案
猜你喜欢
  • 1970-01-01
  • 2020-01-11
  • 2016-03-02
  • 2020-04-26
  • 1970-01-01
  • 2020-04-21
  • 2022-01-11
  • 2011-10-01
  • 2016-03-04
相关资源
最近更新 更多