使用long double
我得到18/19 = 0.947368421052631578...
,947368421052631578
是重复小数。使用double
我得到0.947368421052631526...
但是,前者是正确的。为什么这样的结果不正确?double和precision
感谢您的帮助。
使用long double
我得到18/19 = 0.947368421052631578...
,947368421052631578
是重复小数。使用double
我得到0.947368421052631526...
但是,前者是正确的。为什么这样的结果不正确?double和precision
感谢您的帮助。
A double
通常提供16(±1)个十进制数字。您的示例显示了这一点:
4 8 12 16
v v v v
0.947368421052631578 long double
0.947368421052631526 double
答案同意为16位数字。这是应该预料的。另请注意,C标准中没有保证long double
比double
更精确。
您试图用有限的位数表示每个十进制数。有些东西不能完全以浮点形式表达。期待与浮游物确切的答案是你的第一个问题。看看What Every Computer Scientist Should Know About Floating-Point Arithmetic
这里有一个总结,从some lecture notes:
正如前面提到的,计算机不能精确代表实数,因为有位用于存储实数只有有限数量。因此,任何具有无限数字的数字如1/3,2的平方根和PI都不能完全表示。而且,由于编码实数的方式,即使是有限数量的数字也不能精确表示。
double
甲其通常与IEEE 754实现将是准确的,以15和17之间的十进制数字。即使你可以让编译器显示它,任何过去都不可信的东西。
让我重新解释一下你的问题:你很惊讶“长双倍”比“双倍”更精确? – raina77ow