基本上:
float nanf=std::numeric_limits::signaling_NaN<decltype(g_nanf)>();
double nand = nanf;
assert(std::isnan(nand));
能断言火吗? 如果我将双纳米分配给浮动
那也是怎么回事答案 0 :(得分:3)
来自N3337:
4.6浮点促销[conv.fpprom]
1类型
float
的prvalue可以转换为double
类型的prvalue。 该值不变。
,
4.8浮点转换[conv.double]
1浮点类型的prvalue可以转换为另一个浮点的prvalue 类型。 如果源值可以在中精确表示 目的地类型,转换的结果是准确的 表示。如果源值在两个相邻之间 目的地值,转换的结果是 实现定义的这两个值的选择。除此以外, 行为未定义。
和
3.9.1基本类型[basic.fundamental]
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-ness。从double
到float
可能有点迟了,但是当double
支持NaN时,我们得出结论,这种转换也必须通过“值的子集”措辞来保留。
(What the word "value" actually means seems to be somewhat ill-defined.)
答案 1 :(得分:1)
C ++并不要求遵守IEEE-754;但是,对于遵循该标准的平台,第6.2节规定了安静NaN的行为:
对于具有安静NaN输入的操作,除了最大和最小操作之外,如果要传递浮点结果,则结果应为安静的NaN 。 ..
并发信号通知NaNs:
在默认异常处理下,任何发出无效操作异常并且要为其传递浮点结果的操作都应该提供一个安静的NaN。
信令NaN应该是保留的操作数,在默认的异常处理下,为每个通用计算和信令计算操作发出无效操作异常(见7.2)...
答案 2 :(得分:0)
BoBTFish's answer听起来很有说服力。现在,我自己没有关于这个主题的规范性信息,但我想提供一个基于一点推论的替代答案:
通常情况下:
NaN
的任何表达都必须返回NaN
。single
和double
投射,可能多次。我没有看到编译器如何在NaN
/ float
投射期间保留double
时无法满足这两个要求。