2012-08-23 124 views
5

我正在开发一个在Linux环境下运行的C++应用程序。我需要存储6个deciaml地方的大值。我用了一个双倍的。但分配后,双变量不包含确切的值。它已经圆满了。双精度丢失C++

例:

double dValue = 79447461534242.913072; //Assignement of value 

但在那之后,当我在dValue看到的价值它是像79447461534242.906

有一个人可以让我知道为什么发生这种情况,建议我正确的数据类型它可以保持准确的数值而不会失去精度。

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

不要忘了接受你最喜欢的答案;) –

回答

5

在一个典型的实现中,double具有约15位精度。它们在小数点之前还是之后无关紧要,总共只有15位数字。

就您的情况而言,原始数字大约为20位数,因此五个数字立即丢失。

+0

你肯定在*总共15位精度*?至少在Javascript整数精度是准确的......但我不确定这是否是JavaScript独有的东西。 –

+1

@MarcusRiemer:整数类型在C++中也是精确的;但是这个问题是关于浮点类型的。 –

+0

@MarcusRiemer:'double'和integer是两种完全不同的动物。虽然“高级”语言通常支持任意的精度整数,但C++通常使用硬件提供的内容来实现 - 通常为16位,32位为int,32位或64位长,64位长。 'double'通常是一个具有53位尾数的64位浮点类型。 –

5

C++使用仅在一定程度上精确到某一程度的IEEE浮点类型设计。如果您需要任意精度,请查看例如GNU MP Bignum或任何其他任意的任意精度库。

2

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

您可能会发现long double可提供更高的精度,但不能保证该值大于double

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

1

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

+0

假设你有gcc> 4.6 –

+0

我无法用__float28编译它。它给出错误'__float128'未在此范围内声明 – user1308004

+0

您使用的是gcc的哪个版本?输入'gcc --version' –