C / C ++中双精度浮点值的符号是什么?
.5 表示double或float值?
我很确定2.0f被解析为一个浮点数而2.0作为一个双解析但是.5呢?
答案 0 :(得分:8)
这是双倍的。用f后缀它来浮动。
以下是参考文档的链接:http://en.cppreference.com/w/cpp/language/floating_literal
答案 1 :(得分:1)
从技术上讲,使用double常量初始化float可能会导致与使用float常量初始化不同的结果(即累计2舍入错误)。
以下是一个例子:
#include <stdio.h>
int main() {
double d=8388609.499999999068677425384521484375;
float f1=8388609.499999999068677425384521484375f;
float f2=8388609.499999999068677425384521484375;
float f3=(float) d;
printf("f1=%f f2=%f f3=%f\n",f1,f2,f3);
}
使用gcc 4.2.1 i686我得到了
f1=8388609.000000 f2=8388610.000000 f3=8388610.000000
常数完全在基数2中:
100000000000000000000001.011111111111111111111111111111
Base 2表示需要54位,double只有53位。所以当转换为double时,它会四舍五入到最接近的double,并且为even,因此:
100000000000000000000001.10000000000000000000000000000
Base 2表示需要25位,float只有24,所以如果你将这个double转换为float,那么另一个舍入发生在最近的float,绑定到even,因此:
100000000000000000000010.
如果将第一个数字直接转换为浮点数,则单个舍入不同:
100000000000000000000001.
正如我们所看到的,当初始化f2时,gcc将十进制表示转换为double,然后转换为float(检查行为是否由标准确定将会很有趣。)
虽然这是一个特制的数字,但大多数时候你不应该遇到这样的差异。