C++ 双精度

C++ 双精度,c++,math,double,C++,Math,Double,使用长双精度我得到了18/19=0.947368421052631578…,并且947368421052631578是重复的十进制数。使用double我得到0.947368421052631526…但是,前者是正确的。为什么会出现这样不正确的结果 谢谢您的帮助。您试图用有限的位来表示每个十进制数。有些东西不能用浮点表示。第一个问题是用浮点数来期待准确的答案。看看 以下是来自以下方面的总结: 如前所述,计算机不能精确地表示实数,因为存储实数的位数是有限的。因此,任何具有无限位数的数字(如1/3、2

使用长双精度我得到了
18/19=0.947368421052631578…
,并且
947368421052631578
是重复的十进制数。使用
double
我得到
0.947368421052631526…
但是,前者是正确的。为什么会出现这样不正确的结果


谢谢您的帮助。

您试图用有限的位来表示每个十进制数。有些东西不能用浮点表示。第一个问题是用浮点数来期待准确的答案。看看

以下是来自以下方面的总结:

如前所述,计算机不能精确地表示实数,因为存储实数的位数是有限的。因此,任何具有无限位数的数字(如1/3、2的平方根和PI)都不能完全表示。此外,由于实数编码的方式,即使是有限数量的数字也无法精确表示


您试图用有限的位来表示每个十进制数。有些东西不能用浮点表示。第一个问题是用浮点数来期待准确的答案。看看

以下是来自以下方面的总结:

如前所述,计算机不能精确地表示实数,因为存储实数的位数是有限的。因此,任何具有无限位数的数字(如1/3、2的平方根和PI)都不能完全表示。此外,由于实数编码的方式,即使是有限数量的数字也无法精确表示


通常使用的
double
将精确到15到17位小数。任何不可信的过去,即使您可以让编译器显示它。

通常使用实现的
双精度
将精确到15到17位小数。任何不能信任的过去的内容,即使您可以让编译器显示它。

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

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

答案是16位数。这是应该预料到的。还要注意的是,在C标准中不能保证长双精度比双精度

a
双精度
通常提供16(±1)个十进制数字。您的示例显示:

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

答案是16位数。这是应该预料到的。还要注意的是,在C标准中没有保证长双精度比长双精度更精确。让我重新表述一下你的问题:你惊讶于长双精度比长双精度更精确吗?让我重新表述一下你的问题:你惊讶于长双精度比长双精度更精确吗比double?也许值得一提的是(我意识到这是8年后的事),它们不能代表一些实数。某些实数可以精确地表示,即使使用浮点。当使用浮点表示法时,说所有实数都有错误是不太准确的。(但是非常棒的链接,谢谢!)也许值得(我意识到这是8年后的事)注意到它们不能代表一些真实的数字。某些实数可以精确地表示,即使使用浮点。当使用浮点表示法时,说所有实数都有错误是不太准确的。(但是非常棒的链接,谢谢!)