我写了一个小程序并在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);
答案 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)时,左侧会发生舍入,但不会在右侧。