C/C++ 中双精度浮点值的表示法是什么?
.5
代表双精度值还是浮点值?
我很确定2.0f
被解析为浮点数和2.0
双精度数,但是 0.5 呢?
C/C++ 中双精度浮点值的表示法是什么?
.5
代表双精度值还是浮点值?
我很确定2.0f
被解析为浮点数和2.0
双精度数,但是 0.5 呢?
是双倍的。后缀 f 以获得浮动。
这里是参考文件的链接: http: //en.cppreference.com/w/cpp/language/floating_literal
从技术上讲,使用双精度常量初始化浮点数可能导致与使用浮点常量初始化不同的结果(即累积 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 位,双精度只有 53 位。因此,当转换为双精度时,它会舍入到最接近的双精度,与偶数相等,因此:
100000000000000000000001.10000000000000000000000000000
Base 2 表示需要 25 位,浮点数只有 24 位,因此如果将此双精度数转换为浮点数,则会对最近的浮点数进行另一个舍入,与偶数绑定,从而:
100000000000000000000010.
如果将第一个数字直接转换为浮点数,则单次舍入是不同的:
100000000000000000000001.
如我们所见,在初始化 f2 时,gcc 将十进制表示转换为双精度,然后再转换为浮点(检查行为是否由标准确定会很有趣)。
不过,由于这是一个特制的数字,大多数时候你不应该遇到这种差异。