双精度:大数字的乘法运算

Double precision: Multiplication of big numbers

本文关键字:运算 数字 双精度      更新时间:2023-10-16

我对大数字(整数)进行了一些简单的运算(减法、乘法)。它们太大了,所以我必须将它们存储到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的平台,您可能会非常幸运。