使用
long double
我得到18/19 = 0.947368421052631578...
,947368421052631578
是循环小数。使用 double
我得到 0.947368421052631526...
但是,前者是正确的。为什么结果这么不正确?
感谢您的帮助。
A
double
通常提供 16(±1) 位十进制数字。你的例子表明了这一点:
4 8 12 16
v v v v
0.947368421052631578 long double
0.947368421052631526 double
答案同意 16 位数字。这是应该预料到的。另请注意,C 标准中不保证
long double
比 double
具有更高的精度。
注意,数学运算后最后一位十进制数字(16 或 17)不会保持准确(至少在所有实现和/或平台中),因此将代码限制为 15 位。
此外,
double
可以存储小数点之前或之后的15位数字,而不是同时存储在两侧(否则进动会丢失)。
您试图用有限数量的位来表示每个十进制数。有些东西无法用浮点精确表达。期待浮点数的确切答案是您的第一个问题。看看每个计算机科学家应该了解的浮点运算知识
以下是一些讲义的摘要:
如前所述,计算机无法精确表示实数,因为用于存储实数的位数是有限的。因此,任何具有无限位数的数字(例如1/3、2的平方根、PI)都无法完全表示。而且,由于实数的编码方式,即使是有限个位数也无法精确表示。