双精度:大数的乘法

时间:2012-03-17 22:29:12

标签: c++ double precision multiplication long-double

我有一些简单的操作(减法,乘法)和大数(整数)。它们太大了,我必须将它们存储到long double变量中。这很好,但在某些情况下,乘法会失去精确度。

示例:

A = 84478098072866400.00
B = 419247971803584000000.00

A * B = 35417271278873496315650351919301394432.00

很明显,这是错误的。乘法结果应以零序列结束。

我需要保持精度,特别是这个(当数字以零结尾时),因为这是最常见的情况。

我的问题是,请问怎么做?有什么方法可以强迫long double表现得更好吗?或者有没有选项如何获得存储号码的精确度?

非常感谢!

修改

我不能使用任何外部库。我正在努力解决ACM竞争档案的一个问题。这是其中的一部分。

我会很精确地丢失精确度,但我必须检测它。当数字大于long double时,它很可能(可能是确定的),它以较长的零序列结束。

3 个答案:

答案 0 :(得分:1)

如果您真的使用大整数,那么您将需要执行arbitrary precision arithmetic,其中只有内存限制数字的大小(并且不会丢失精度)。 The GNU Multiple Precision Arithmetic Library是一个流行的库(对于有理数和浮点数的任意精度算术),虽然我确定还有其他的。

答案 1 :(得分:0)

如果你正在使用大整数,为什么不尝试编写一个bigint类而不是使用long double? 检查一下:

sample c++ code of a big int class

How to implement big int in C++

答案 2 :(得分:0)

你知道你需要处理的最大值是多长时间?

我问,因为我注意到gcc在某些平台上支持128位整数:
http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html

所以你可能会非常幸运,如果你能够获得支持128位长的平台和最新的gcc。