首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GMP解析十进制值?

用GMP解析十进制值?
EN

Stack Overflow用户
提问于 2013-03-11 05:15:28
回答 1查看 1.2K关注 0票数 0

如何准确地解析十进制值?也就是说,我有一个字符串的值,像"43.879“,我希望得到一个确切的GMP值。从文档中我不清楚是怎么做到的,或者这是否真的是可能的。它似乎不适合整数/ rational /float值类型--尽管使用rational可能是可能的。

我的目的是在加法和减法等运算中保持精确的小数,但对于像除法或指数这样的运算,我要切换到高精度的浮点。

EN

回答 1

Stack Overflow用户

发布于 2013-03-11 06:22:29

大多数图书馆给你任意大的精度,包括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。只是二进制数字表示无法做到这一点。这就是较新的浮点标准出现的地方,也是英特尔小数点库的发展方向。

重复前面的示例,假设您有一台10基计算机,它可以执行10个基本数字。该计算机不能将1/3存储为“普通”浮点数。它必须存储数字为1/3的表示,这相当于它在纸上的写法。试着把1/3写成纸上的10基浮点数。

还请参见Why can't decimal numbers be represented exactly in binary?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15331631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档