标题几乎要问所有问题,但要提供MCVE:
#include <cmath>
int main()
{
float f = std::nanf("");
double d = static_cast<double>(f);
return 0;
}
在MSVC 2017下,f
和d
都报告为nan
,但这并不能证明,因为static_cast
可能是未定义的行为。
以类似的方式,0.0f / 0.0f
产生-nan(ind)
,我将假设这是一个信号传递,是否遵循相同的已定义/未定义规则?同上inf
。
答案 0 :(得分:1)
name
仅仅是promoting MaxPrice
,它总是被定义。零除为undefined(即使不进行任何强制转换),尽管许多实现允许根据IEEE 754规则将其用于浮点类型。在普通系统上从未遇到过信令NaN的问题。改为使用floating-point exceptions。
答案 1 :(得分:1)
这看起来是标准所保证的,我们可以从[expr.static.cast]p4部分开始说:
[over.best.ics]涵盖了如果存在从e到T的隐式转换序列,则可以将表达式e显式转换为T类型。
隐式转换序列,我们具有以下内容:
[over.ics.scs]涵盖了格式正确的隐式转换序列是以下形式之一:
-(3.1)标准转换顺序,
...
和标准转换顺序,其中说:
[注:如[conv]中所述,标准转换序列本身就是身份转换(即无转换),或者由其他四个类别的一到三个转换组成。 如果序列中有两个或多个转换,则转换将按以下规范顺序应用:左值转换,升级或转换,资格调整。 —尾注]
,我们在[conv.fpprom]p1中介绍了浮点数提升案例,内容为:
float类型的prvalue可以转换为double类型的prvalue。 该值不变。
采用另一种方法 double 转换为 float 将是一次转换,并且在[conv#double]p1中进行了介绍:
浮点类型的prvalue可以转换为另一种浮点类型的prvalue。 如果可以在目标类型中准确表示源值,则转换的结果就是该准确表示。 如果源值在两个相邻的目标值之间,则转换的结果是这些值之一的实现定义选择。否则,行为是不确定的。
这种情况取决于来源是否可以由目的地准确表示,这是无法保证的。
关于浮点除以零的子问题很复杂,并在我对The behaviour of floating point division by zero的回答中进行了介绍。