我写了一个小程序,在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);
不是。Adouble
通常是一个IEEE 754 双精度浮点数,这意味着它有一个 52 位的小数字段。包括隐含的前导 1 给出 53 个有效位,或大约 16 个十进制数字:
对数10 (2 53 ) ≈ 15.955
假设您在 Intel 平台上,long double
通常是一个80 位浮点数和一个 64 位有效数字。这给出了大约 19 个十进制数字的精度:
对数10 (2 64 ) ≈ 19.266
并非所有有理数都可以准确地表示为浮点数;即使源代码中的有效位数在 C++ 编译器使用的限制范围内。
这是因为有理数的内部表示可能使用与源代码中不同的基数。例如
0.1 10 = 0.00̅0̅1̅1̅ 2
所以在数学上,0.1 10的二进制表示具有无限数量的非零数字,即使小数位数远不及内部表示可用的有效位数。这导致了结合律
(a + b) - b = a + (b - b)
不再成立,因为在评估 (a + b) 时,舍入发生在左侧,而不是右侧。