2013-03-11 109 views
0

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

我的意图是在像加法和减法这样的操作上保留精确的精度小数,但切换到像分割或指数这样的操作的高精度浮点。

回答

0

大多数图书馆给你任意大的精度,包括GMP。然而,即使有很高的精度,也有一些数字不能完全用二进制格式表示,与你无法用十进制表示1/3相同。对于许多应用程序将精度设置为较高的数值(如10),进行计算,然后将结果四舍五入为期望的精度,如3个作品。它不适合你吗?请参阅本 - Is there a C++ equivalent to Java's BigDecimal?

你也可以使用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。只是二进制数字表示不会这样做。这就是更新的浮点标准进入的地方,那就是intel小数点库的发展方向。

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

另请参阅Why can't decimal numbers be represented exactly in binary?

+0

是的,我明白这一点。我只是想精确地表示从十进制形式的字符串解析的数字。这保证了对于那些人来说必须存在一个确切的表示形式,无论是作为一个有理数,还是整数乘以十的幂。我只是想知道如何获得在GMP中分析的数字(因为理性不公开这样的解析器)。 – 2013-03-11 08:41:31

+0

许多数字的二进制浮点不存在精确表示;大多数当前浮点库提供的类型。像0.1这样的数字不能被表示为二进制数字,无论精度如何。 但是,人们确实认识到需要精确地表示0.1。只是二进制数字表示不会这样做。这就是更新的浮点标准进入的地方,那就是intel小数点库的发展方向。 – Amit 2013-03-11 13:28:44

+0

GMP有一个“理性”类,其中0.1可以完全表示为1/10。我正在寻找一种标准的方法来解析十进制数字到这种形式(假设理性是正确的形式)。 – 2013-03-11 14:36:04