使用GMP解析十进制值

Parsing decimal values with GMP?

本文关键字:十进制 GMP 使用      更新时间:2023-10-16

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

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

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

也可以使用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为基数的浮点数。

请参见为什么十进制数可以精确地用二进制表示?