2012-06-19 41 views
-1

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

感谢您的帮助。

+6

让我重新解释一下你的问题:你很惊讶“长双倍”比“双倍”更精确? – raina77ow

回答

7

A double通常提供16(±1)个十进制数字。您的示例显示了这一点:

 4 8 12 16 
    v v v v 
0.947368421052631578 long double 
0.947368421052631526 double 

答案同意为16位数字。这是应该预料的。另请注意,C标准中没有保证long doubledouble更精确。

8

您试图用有限的位数表示每个十进制数。有些东西不能完全以浮点形式表达。期待与浮游物确切的答案是你的第一个问题。看看What Every Computer Scientist Should Know About Floating-Point Arithmetic

这里有一个总结,从some lecture notes

正如前面提到的,计算机不能精确代表实数,因为有位用于存储实数只有有限数量。因此,任何具有无限数字的数字如1/3,2的平方根和PI都不能完全表示。而且,由于编码实数的方式,即使是有限数量的数字也不能精确表示。

6

double甲其通常与IEEE 754实现将是准确的,以15和17之间的十进制数字。即使你可以让编译器显示它,任何过去都不可信的东西。