使用GMP解析十进制值
Parsing decimal values with GMP?
如何准确解析十进制值?也就是说,我有一个值的字符串,如"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为基数的浮点数。
请参见为什么十进制数可以精确地用二进制表示?
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- 计算十进制 c++ 之后的数字
- C++从二进制转换为十进制数
- 使用 GMP 的 while 循环出现问题
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- 有没有一个 c++ gmp 库函数与 python gmpy2 库 divm(..) 函数相同?
- cin 的十进制输入验证?
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 将分数转换为十进制数并对其进行排序
- 使用 MinGW 在 Windows 上安装 GMP 时出错
- uint8_t同一二进制文件的不同十进制值
- 如何打印大于"无符号长长"的"std::bitset"的十进制值?
- 调用方如何知道 VARIANT 中何时有十进制?
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- GMP:如何将数字写成十进制值
- 使用GMP解析十进制值