是否定义了static_cast <double>(std :: nanf(“”))?

时间:2018-10-31 03:26:44

标签: c++ floating-point language-lawyer nan

标题几乎要问所有问题,但要提供MCVE:

#include <cmath>

int main()
{
    float f = std::nanf("");
    double d = static_cast<double>(f);
    return 0;
}

在MSVC 2017下,fd都报告为nan,但这并不能证明,因为static_cast可能是未定义的行为。

以类似的方式,0.0f / 0.0f产生-nan(ind),我将假设这是一个信号传递,是否遵循相同的已定义/未定义规则?同上inf

2 个答案:

答案 0 :(得分:1)

name仅仅是promoting MaxPrice,它总是被定义。零除为undefined(即使不进行任何强制转换),尽管许多实现允许根据IEEE 754规则将其用于浮点类型。在普通系统上从未遇到过信令NaN的问题。改为使用floating-point exceptions

答案 1 :(得分:1)

这看起来是标准所保证的,我们可以从[expr.static.cast]p4部分开始说:

  

如果存在从e到T的隐式转换序列,则可以将表达式e显式转换为T类型。

[over.best.ics]涵盖了

隐式转换序列,我们具有以下内容:

  

格式正确的隐式转换序列是以下形式之一:
  -(3.1)标准转换顺序,
  ...

[over.ics.scs]涵盖了

标准转换顺序,其中说:

  

[注:如[conv]中所述,标准转换序列本身就是身份转换(即无转换),或者由其他四个类别的一到三个转换组成。   如果序列中有两个或多个转换,则转换将按以下规范顺序应用:左值转换,升级或转换,资格调整。   —尾注]

,我们在[conv.fpprom]p1中介绍了浮点数提升案例,内容为:

  

float类型的prvalue可以转换为double类型的prvalue。   该值不变。

采用另一种方法 double 转换为 float 将是一次转换,并且在[conv#double]p1中进行了介绍:

  

浮点类型的prvalue可以转换为另一种浮点类型的prvalue。   如果可以在目标类型中准确表示源值,则转换的结果就是该准确表示。   如果源值在两个相邻的目标值之间,则转换的结果是这些值之一的实现定义选择。否则,行为是不确定的。

这种情况取决于来源是否可以由目的地准确表示,这是无法保证的。

关于浮点除以零的子问题很复杂,并在我对The behaviour of floating point division by zero的回答中进行了介绍。