C ++双精度只有3位数吗?

时间:2013-10-30 17:49:36

标签: c++ precision

我写了一个小程序并在wintel上运行。如果x是double,则得到3,如果x被定义为long double,则得到4。这是否意味着这些类型只能精确到3或4位小数?

由于

double x = 1;
long double f = 0.1;

while (x+f-f == x) f /= 10;

int precision = 1-log10(f);

2 个答案:

答案 0 :(得分:6)

没有。 double通常为IEEE 754 double-precision floating point number,这意味着它具有52位分数字段。包括隐式前导1给出53个有效位,或大约16个十进制数字:

log 10 (2 53 )≈15.955

假设您使用的是英特尔平台,long double通常是带有64位有效数字的80-bit floating point number。这给出了大约19个十进制数字的精度:

log 10 (2 64 )≈19.266

答案 1 :(得分:1)

并非所有有理数都可以准确地表示为浮点数;即使源代码中的有效位数落在C ++编译器使用的限制范围内。

这是因为有理数的内部表示可能使用与源代码中不同的基础。例如

  

0.1 10 =0.00̅0̅1̅1̅ 2

在数学上,0.1 10 的二进制表示具有无限数量的非零数字,即使小数位数远不及内部表示可用的有效位数。这导致了关联法则

  

(a + b) - b = a +(b - b)

不再存在,因为在评估(a + b)时,左侧会发生舍入,但不会在右侧。