双精度:大数字的乘法运算
Double precision: Multiplication of big numbers
我对大数字(整数)进行了一些简单的运算(减法、乘法)。它们太大了,所以我必须将它们存储到long double
变量中。这很好,但在某些情况下乘法会失去精度。
示例:
A = 84478098072866400.00
B = 419247971803584000000.00
A * B = 35417271278873496315650351919301394432.00
很明显,这是错误的。乘法运算的结果应该以零序列结束。
我需要保持精度,尤其是这个(当数字以零结尾时),因为这是最常见的情况。
我的问题是,请怎么做?有没有办法迫使long double
表现得更好?或者有任何选项如何获得存储数字的精度?
非常感谢!
编辑:
我不能使用任何外部库。我正在努力解决ACM竞赛档案的一个问题。这是其中的一部分。
如果失去精度,我会很好,但我必须检测它。当数字大于long double
时,很有可能(也许是肯定的),它以长的零序列结束。
如果你真的在处理大整数,你会想做任意精度的算术运算,只有内存限制了数字的大小(并且不会丢失精度)。GNU多精度算术库是一个流行的库(以及有理数和浮点数上的任意精度算术),尽管我相信还有其他库。
如果您使用的是大整数,为什么不尝试编写bigint类而不是使用长双精度?检查这个:
一个大int类的示例c++代码
如何在C++中实现big int
您知道需要处理的最大值以位为单位有多长吗?
我之所以这么问,是因为我注意到gcc在某些平台上支持128位整数:
http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html
因此,如果您能够获得一个支持128位长和最新gcc的平台,您可能会非常幸运。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 使用C++中的模板和运算符重载执行矩阵运算
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- GCC本机矩阵运算库
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 具有非常非常大数字的算术运算
- 使用数字列表和算术运算获取目标数字
- 仅按位运算反转(翻转)数字的最后 n 位
- 使用环绕式c++对两个数字进行二进制加法运算
- 这是否可以通过 C++ 或 C# 中的某种数学运算将 1000 万位数字转换为 1000 位数字
- 如何对非常大的数字进行算术运算
- 双精度:大数字的乘法运算
- 浮点运算是如何在一个大数字上加一的
- 如何用非标准二进制表示法对数字进行算术运算
- 仅需要k位数字时的快速指数运算-续
- 当算术运算溢出时,它们会产生一个确定性的数字