如何以最大精度存储双精度数

8

我在使用最大可用精度存储数字方面遇到了一些困难:

double tmp = 569.232306826889043804840184748172760009765625L;

我正在尝试将它打印在屏幕上:
printf("%0.52f\n", tmp);

我得到的结果如下:

569.2323068268890400000000000000000000000000000000000000

这是我可以达到的最高精度吗?


补充:我正在使用Visual Studio 2008。


2
在C++中,您可以使用std::numeric_limits来查找限制和精度。 - Some programmer dude
你还应该记住,不仅有精度,还有准确性。许多十进制数无法用浮点数精确表示。 - Felix Bytow
2
我在存储具有最大可用精度的数字方面遇到了一些困难。为什么会卡住呢?只需声明一个double(或long double),你就可以获得“最大精度”。否则,我不完全理解你的问题。 - PaulMcKenzie
请查阅 IEEE 754 了解浮点数的相关信息。 - wrossmck
如果你需要比这更高的精度,网络上有许多高精度库可供使用。 - Robinson
2个回答

15

一个double通常以IEEE 754二进制64位格式存储。

二进制64位具有52个的精度,而不是52个十进制数字 - 这相当于最多17个十进制数字,这正是您正在显示的内容。


这是我能达到的最高精度吗?

某些平台可能会提供实际上比double更大的long double,但你的似乎没有。

如果您需要更高的精度,则可以使用公开支持您硬件的一些更大/更精确类型的库(例如80位扩展双精度),或者在软件中工作的任意精度库。


该语言并未指定double的精度,但它确实指定了最低要求。52位是典型值,但不是必需的。 - Keith Thompson
准确地说,这个答案描述了IEEE-754二进制双精度(“binary64”)格式的一些特征。这是与问题相关的浮点格式,但不应认为C要求实现使用该格式作为其类型“double”的表示。尽管如今这仍然是最常见的选择。 - John Bollinger

6
这是你的C实现中double类型的精度。符合标准的C实现也有一个long double类型,它可能提供更高的精度。
如果您需要比这更高的精度,则有数值库提供任意精度的数值类型和操作函数。其中之一是GNU多精度算术库;它适用于许多平台,包括与您相关的Win32和Win64。

该链接网站包含“它也被知道在Windows的32位和64位模式下工作。”。 - cremno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接