0

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

谢谢

double x = 1;
long double f = 0.1;

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

int precision = 1-log10(f);
4

2 回答 2

6

不是。Adouble通常是一个IEEE 754 双精度浮点数,这意味着它有一个 52 位的小数字段。包括隐含的前导 1 给出 53 个有效位,或大约 16 个十进制数字:

      对数10 (2 53 ) ≈ 15.955

假设您在 Intel 平台上,long double通常是一个80 位浮点数和一个 64 位有效数字。这给出了大约 19 个十进制数字的精度:

      对数10 (2 64 ) ≈ 19.266

于 2013-10-30T17:52:41.440 回答
1

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

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

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

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

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

不再成立,因为在评估 (a + b) 时,舍入发生在左侧,而不是右侧。

于 2013-10-30T18:25:08.977 回答