假设float a = (1.5 * b)
其中b
是浮点数,那么这个表达式是如何计算的?
1.5
被视为double还是float?
答案 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
部分(其中 包含float
至double
等更安全的促销活动)声明:
浮点类型的右值可以转换为另一个浮点类型的右值。如果源值可以在目标类型中准确表示,则转换的结果就是精确表示。如果源值在两个相邻目标值之间,则转换结果是这些值中任一个的实现定义选择。否则,行为未定义。
浮点促销中允许的转化被排除在浮点转化集之外。
换句话说,如果乘法导致浮点范围之外的值,则所有投注均关闭。如果b
约为浮点数最大绝对值的67%(正数或负数,无关紧要),则很可能发生这种情况。