在分配给不同大小的FP类型时保留isnan。

时间:2014-02-25 15:47:37

标签: c++ nan ieee-754

基本上:

float  nanf=std::numeric_limits::signaling_NaN<decltype(g_nanf)>();
double nand = nanf;
assert(std::isnan(nand));

能断言火吗? 如果我将双纳米分配给浮动

那也是怎么回事

3 个答案:

答案 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有三种浮点类型:floatdoublelong double。类型double提供   至少与float一样精确,long double类型提供   至少与double一样精确。 该类型的值集   floatdouble 类型值的一部分;这一组   类型double的值是该类型的值集的子集   long double

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

  

7.12.3.4 isnan

     

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

总结一下:是的,从float转到double应保留NaN-ness。从doublefloat可能有点迟了,但是当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
  • 算术表达式可能涉及从/ singledouble投射,可能多次。

我没有看到编译器如何在NaN / float投射期间保留double时无法满足这两个要求。