【发布时间】:2012-01-06 12:30:11
【问题描述】:
假设float a = (1.5 * b) 其中b 是浮点数,那么如何评估这个表达式?
1.5 被视为双精度还是浮点数?
【问题讨论】:
标签: c++
假设float a = (1.5 * b) 其中b 是浮点数,那么如何评估这个表达式?
1.5 被视为双精度还是浮点数?
【问题讨论】:
标签: c++
1.5 是双精度的,用 1.5f 表示浮点数,它的实际作用:
float a = (float)(1.5 * (double)b)
【讨论】:
1.5 是一个浮点文字,一个双精度值。 C++032.13.3 Floating literals有话要说:
浮点文字由整数部分、小数点、小数部分、e 或 E、可选带符号整数指数和可选类型后缀组成。 ...浮动文字的类型是双精度的,除非后缀明确指定。
13.3.3.1 Standard conversion sequences 部分定义了处理转换的方式,但在这里重复有点枯燥。可以说浮点提升已经完成,4.6 Floating point promotion 部分声明:
float 类型的右值可以转换为 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%(正或负,无关紧要),则很可能会发生这种情况。
【讨论】: