0

如何准确解析十进制值?也就是说,我有一个值字符串,比如“43.879”,我希望得到一个准确的 GMP 值。我从文档中不清楚如何,或者这是否真的可能。它似乎不适合整数/有理数/浮点值类型 - 尽管也许可以使用有理数。

我的意图是在加法和减法等运算中保留精确的小数,但在除法或指数等运算中切换到高精度浮点数。

4

1 回答 1

0

大多数库为您提供任意大的精度,包括 GMP。然而,即使精度很高,也有一些数字不能用二进制格式精确表示,就像你不能用十进制表示 1/3 一样。对于许多应用程序,将精度设置为较高的数字,如 10,进行计算,然后将结果四舍五入回到所需的精度,如 3 工作。它不适合你吗?看到这个 -是否有与 Java 的 BigDecimal 等效的 C++?

您也可以使用http://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library

********* 编辑

对于许多数字,二进制浮点中不存在精确表示;大多数当前浮点库提供的那种。无论精度如何,像 0.1 这样的数字都不能表示为二进制数。

为了能够执行您建议的操作,图书馆必须执行相当于“手动加法”、“手动除法”的操作——您在铅笔和纸上添加两个十进制数的那种。例如,要存储 0.1,库可能会选择将其表示为字符串本身,然后对字符串进行添加。不用说,一个幼稚的实现会使这个过程变得非常缓慢——慢几个数量级。要添加 0.1 + 0.1,它必须解析字符串、添加 1+1、记住进位、记住小数位等。这就是计算机微代码在几个 CPU 周期(或一条指令)内为您所做的事情. 您的软件库最终会占用大约 100 个 CPU 周期/指令,而不是单条指令。

如果它试图将 0.1 转换为一个数字,它又回到了 1 - 0.1 不能是二进制数字。

然而,人们确实认识到准确表示 0.1 的必要性。只是二进制数表示不会这样做。这就是更新的浮点标准出现的地方,也是英特尔小数点库的发展方向。

重复我之前的例子,假设你有一台可以做 10 个基数的 10 个基数的计算机。该计算机无法将 1/3 存储为“普通”浮点数。它必须存储数字为 1/3 的表示。相当于它是如何写在纸上的。尝试在纸上写下 1/3 作为基数为 10 的浮点数。

另请参阅为什么不能用二进制精确表示十进制数?

于 2013-03-11T06:22:29.777 回答