C++ 在指定不同大小的FP类型时保留isnan。

C++ 在指定不同大小的FP类型时保留isnan。,c++,nan,ieee-754,C++,Nan,Ieee 754,基本上: float nanf=std::numeric_limits::signaling_NaN<decltype(g_nanf)>(); double nand = nanf; assert(std::isnan(nand)); float nanf=std::numeric_limits::signaling_NaN(); 双nand=nanf; 断言(std::isnan(nand)); 你能放火吗? 如果我将双nan从N3337分配给浮点,又会怎样呢 4.6浮点升级

基本上:

float  nanf=std::numeric_limits::signaling_NaN<decltype(g_nanf)>();
double nand = nanf;
assert(std::isnan(nand));
float nanf=std::numeric_limits::signaling_NaN();
双nand=nanf;
断言(std::isnan(nand));
你能放火吗? 如果我将双nan从N3337分配给浮点

,又会怎样呢

4.6浮点升级[conv.fpprom]

1可以将
float
类型的PR值转换为
double
类型的PR值该值保持不变。

,

4.8浮点转换[conv.double]

1浮点类型的prvalue可以转换为另一个浮点类型的prvalue 类型如果源值可以在 目标类型,转换的结果就是这样 表示。如果源值介于两个相邻值之间 目标值,转换的结果是 实现定义了这些值中任意一个的选择。否则,, 该行为未定义

3.9.1基本类型[基本.基本]

8有三种浮点类型:
float
double
long double
。类型
double
提供 至少与
float
一样高的精度,并且类型
long double
提供 至少与
double
一样精确类型的值集
float
是类型为
double
的一组值的子集;一套 类型
double
的值是该类型值集的子集
long-double

现在我们应该确认
NaN
实际上是浮点类型的有效值。
isnan
的定义可追溯到
C
标准。从N1570开始:

7.12.3.4
isnan

2
isnan
宏确定其参数值是否为NaN

总结一下:是的,从
float
double
应该保持NaN性。从
double
float
可能有点困难,但由于
double
支持NaN,我们得出结论,这种转换也必须通过“值子集”措辞来保留


()

C++不要求遵守IEEE-754;但是,对于符合标准的平台,第6.2条规定了安静NAN的行为:

对于具有安静NaN输入的操作,除最大和最小操作外,如果要传递浮点结果,则结果应为安静NaN

和信号NAN:

在默认异常处理下,任何发出无效操作异常信号的操作,如果要为其传递浮点结果,则应传递一个安静的NaN

信令NAN应为保留操作数,在默认异常处理下,为每个常规计算和信令计算操作发出无效操作异常信号(见7.2)

听起来很有说服力。现在,我自己没有关于这一主题的规范性信息,但我想根据一点推论提供另一个答案:

一般来说,以下情况是正确的:

  • 一般来说,任何涉及
    NaN
    的表达式都必须返回
    NaN
  • 算术表达式可能涉及从/到
    单次
    双次
    ,可能多次

< >我不明白编译器如何能在不满足<代码>楠< /COD>期间在<代码> <代码> >代码>双< /CUL> > Case.

我认为适当的标准是IEEE 754,如果问题标记的话,我认为我粘贴的引用表明C++中的这个行为是否需要浮点。类型遵循IEEE 754。因此,当他们这样做时,这仍然是正确的。但是,如果你能访问IEEE 754(或者是最新的草案,或者别的什么。我什么都没有)。我很想看到一个有相关引用的答案。但是IEEE 754对于浮点上下文中“值”的含义要清楚得多。例如,根据IEEE754.+1,
+0.0
-0.0
绝对是相同的值;我还在下面提供了相关的IEEE-754引文,以供好奇。
decltype(g_nanf)
?ITYM
浮动