双C ++精度损失

时间:2012-08-23 17:13:34

标签: c++

我正在开发一个在linux环境下运行的C ++应用程序。我需要存储6个deciaml位置的大值。我用了一个双。但是在赋值之后,double变量不包含确切的值。它完善了。

例如:

double dValue = 79447461534242.913072; //Assignement of value

但在那之后,当我看到dValue中的值时,它就像79447461534242.906

有人可以让我知道为什么会这样,并建议我使用正确的数据类型,它可以保持精确值而不会丢失精度。

4 个答案:

答案 0 :(得分:6)

在典型的实现中,double具有大约15位精度总计。无论是小数点之前还是之后都没关系,它总共只有15位数。

在您的情况下,原始号码大约是20位数,因此会立即丢失5位数。

答案 1 :(得分:6)

C ++使用的IEEE浮点类型只能在某种程度上精确按设计。如果您需要仲裁精度,请查看例如GNU MP Bignum或任何其他仲裁精度库。

答案 2 :(得分:2)

most commonly used double precision format以53位精度存储数字。这给出了大约16位精度的十进制数字。

您可能会发现long double提供更高的精确度,但无法保证其大于double

如果您需要比本机类型更高的精度,则需要一个高精度数字库,例如GMP

答案 3 :(得分:1)

在linux上你可以使用__float128这是一种四倍精度浮点类型。