双倍和准确

Ram*_*aba 0 c++ math double

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

感谢帮助.

Jon*_*ler 9

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

     4   8  12  16
     v   v   v   v
0.947368421052631578 long double
0.947368421052631526 double
Run Code Online (Sandbox Code Playgroud)

答案同意16位数.这是应该期待的.另请注意,C标准中无法保证a的long double精度高于a double.


Pau*_*bel 8

您试图用有限的位数表示每个十进制数.有些事情完全不能用浮点表达.期待与浮点数的确切答案是你的第一个问题.看看每个计算机科学家应该知道的关于浮点算术的内容

以下是一些讲义的摘要:

如前所述,计算机不能精确地表示实数,因为只有有限数量的位用于存储实数.因此,任何具有无穷多位数的数字,例如1/3,平方根2和PI都不能完全表示.而且,由于编码实数的方式,甚至无法精确地表示多个有限数量的数字.


Mar*_*som 6

double通常用IEEE 754实现的A 将精确到15到17个十进制数字.即使您可以让编译器显示它,也不能信任任何过去.