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.4isnan
宏
2isnan
宏确定其参数值是否为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浮动
?