2012-01-06 44 views

回答

5

1.5是双,采用1.5F浮法,其实际作用:

float a = (float)(1.5 * (double)b)

3

1.5是浮点文字,双重价值。 C++ 03 2.13.3 Floating literals有这样说:

一个浮动文本由一个整数部分,一个小数点,一个小数部分,电子或E,任选符号整数指数,和一个可选的类型后缀组成。 ...除非通过后缀明确指定,浮点文字的类型是双精度的。

13.3.3.1 Standard conversion sequences13.3.3.1 Standard conversion sequences号定义了处理转换的方式,但在这里重复要稍微干燥。只需说浮点数提升已完成,并且部分4.6 Floating point promotion指出:

float类型的右值可以转换为double类型的右值。价值不变。

因此,float b被提升为一个double来执行乘法。

然后,使用(有效)临时double执行计算,结果是回到float a

因此,有效:

float b = something; 

double xyzzy0 = 1.5; 
double xyzzy1 = (double)b; 
double xyzzy2 = xyzzy0 * xyzzy1; 
float a = xyzzy2; 

这最后一步可能是有问题的。部4.8 Floating point conversions(其包括像floatdouble更安全促销)规定:

浮点类型的右值可以被转换成另一种浮点类型的右值。如果源值可以在目标类型中精确表示,则转换结果就是该确切表示。如果源值位于两个相邻目标值之间,则转换结果是这些值中任一值的实现定义选项。否则,行为是不确定的。

作为浮点升级允许的转换不包括在浮点转换集中。

换句话说,如果乘法结果超出浮动范围的值,则所有的注单都关闭。如果b约等于浮动的最大绝对值的67%(正值或负值,无关紧要),则很可能会发生这种情况。

相关问题