0

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

例子:

A = 84478098072866400.00
B = 419247971803584000000.00

A * B = 35417271278873496315650351919301394432.00

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

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

我的问题是,请问该怎么做?有什么办法可以强迫long double自己表现得更好吗?或者有什么选择如何获得存储数字的精度?

非常感谢!

编辑:

我不能使用任何外部库。我正在尝试解决 ACM 竞赛存档的一个问题。这是其中的一部分。

我会很好地失去精度,但我必须检测到它。当数字大于long double它很可能(也许可以肯定)时,它以长的零序列结束。

4

3 回答 3

1

如果你真的在处理大整数,你会想要做任意精度的算术,只有内存限制你的数字的大小(并且没有精度丢失)。GNU Multiple Precision Arithmetic Library是一个流行的库(以及关于有理数和浮点数的任意精度算术),尽管我确信还有其他库。

于 2012-03-17T22:32:19.177 回答
0

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

大 int 类的示例 C++ 代码

如何在 C++ 中实现大 int

于 2012-03-17T22:37:31.547 回答
0

你知道你需要处理的最大值是多长(以位为单位)吗?

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

所以你可能会很幸运,如果你能得到一个支持 128 位长的平台和一个最新的 gcc。

于 2012-03-18T04:05:15.000 回答