使用long double
我得到18/19 = 0.947368421052631578...
,947368421052631578
是重复的小数。使用double
我得到0.947368421052631526...
但是,前者是正确的。为什么这么错误的结果?
感谢您的帮助。
答案 0 :(得分:8)
您试图用有限的位数表示每个十进制数。有些事情完全不能用浮点表达。期待与浮点数的确切答案是你的第一个问题。看看What Every Computer Scientist Should Know About Floating-Point Arithmetic
以下是some lecture notes的摘要:
如前所述,计算机不能精确地表示实数,因为只有有限数量的位用于存储实数。因此,任何具有无穷多位数的数字,例如1/3,平方根2和PI都不能完全表示。而且,由于编码实数的方式,甚至无法精确地表示多个有限数量的数字。
答案 1 :(得分:7)
double
通常提供16(±1)个十进制数字。您的示例显示了这一点:
4 8 12 16
v v v v
0.947368421052631578 long double
0.947368421052631526 double
答案同意16位数字。这是应该期待的。另请注意,C标准中无法保证long double
的精确度高于double
。
答案 2 :(得分:6)
通常用IEEE 754实现的double
将精确到15到17位十进制数字。即使您可以让编译器显示它,也不能信任任何过去。