使用long double
I get 18/19 = 0.947368421052631578...
, and947368421052631578
是重复的小数。使用double
I get0.947368421052631526...
但是,前者是正确的。为什么会有这样不正确的结果?
感谢帮助。
Adouble
通常提供 16(±1) 个十进制数字。您的示例显示了这一点:
4 8 12 16
v v v v
0.947368421052631578 long double
0.947368421052631526 double
答案同意 16 位数字。这是应该预料到的。另请注意,C 标准中不能保证 along double
比 a 具有更高的精度double
。
您试图用有限的位数来表示每个十进制数。有些东西不能准确地用浮点数表达。期待浮点数的准确答案是您的第一个问题。看看每个计算机科学家应该知道的关于浮点运算的知识
以下是一些讲义的摘要:
如前所述,计算机不能精确地表示实数,因为存储实数的位数是有限的。因此,任何具有无限位数的数字,例如 1/3、2 的平方根和 PI,都不能完全表示。此外,由于实数的编码方式,即使是有限位数也不能精确表示。
double
通常使用IEEE 754实现的A将精确到 15 到 17 位十进制数字。任何过去都不能被信任的东西,即使你可以让编译器显示它。