如何在Visual C ++中将浮点文字处理为double或float?

时间:2012-01-06 12:30:11

标签: c++

假设float a = (1.5 * b)其中b是浮点数,那么这个表达式是如何计算的? 1.5被视为double还是float?

2 个答案:

答案 0 :(得分:5)

1.5是double,使用1.5f表示浮动,实际上是什么:

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

答案 1 :(得分:3)

1.5是一个浮点字面值,是一个double值。 C ++ 03 2.13.3 Floating literals有这样的说法:

  

浮动文字由整数部分,小数点,小数部分,e或E,可选的有符号整数指数和可选的类型后缀组成。 ...除非后缀明确指定,否则浮动文字的类型为double。

13.3.3.1 Standard conversion sequences节定义了处理转化的方式,但在此处重复有点干。我只想说浮点数促销已经完成,第4.6 Floating point promotion节说明:

  

float类型的rvalue可以转换为double类型的右值。价值没有变化。

因此float b被提升为双倍以执行乘法。

然后使用(有效)临时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%(正数或负数,无关紧要),则很可能发生这种情况。