c / c ++双浮点值表示法

时间:2012-11-07 19:34:31

标签: c++ floating-point numbers double

C / C ++中双精度浮点值的符号是什么?

.5 表示double或float值?

我很确定2.0f被解析为一个浮点数而2.0作为一个双解析但是.5呢?

http://c.comsci.us/etymology/literals.html

2 个答案:

答案 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(检查行为是否由标准确定将会很有趣。)

虽然这是一个特制的数字,但大多数时候你不应该遇到这样的差异。