双倍和准确

时间:2012-06-19 22:00:26

标签: c++ math double

使用long double我得到18/19 = 0.947368421052631578...947368421052631578是重复的小数。使用double我得到0.947368421052631526...但是,前者是正确的。为什么这么错误的结果?

感谢您的帮助。

3 个答案:

答案 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位十进制数字。即使您可以让编译器显示它,也不能信任任何过去。