我有一些简单的操作(减法,乘法)和大数(整数)。它们太大了,我必须将它们存储到long double
变量中。这很好,但在某些情况下,乘法会失去精确度。
示例:
A = 84478098072866400.00
B = 419247971803584000000.00
A * B = 35417271278873496315650351919301394432.00
很明显,这是错误的。乘法结果应以零序列结束。
我需要保持精度,特别是这个(当数字以零结尾时),因为这是最常见的情况。
我的问题是,请问怎么做?有什么方法可以强迫long double
表现得更好吗?或者有没有选项如何获得存储号码的精确度?
非常感谢!
修改
我不能使用任何外部库。我正在努力解决ACM竞争档案的一个问题。这是其中的一部分。
我会很精确地丢失精确度,但我必须检测它。当数字大于long double
时,它很可能(可能是确定的),它以较长的零序列结束。
答案 0 :(得分:1)
如果您真的使用大整数,那么您将需要执行arbitrary precision arithmetic,其中只有内存限制数字的大小(并且不会丢失精度)。 The GNU Multiple Precision Arithmetic Library是一个流行的库(对于有理数和浮点数的任意精度算术),虽然我确定还有其他的。
答案 1 :(得分:0)
如果你正在使用大整数,为什么不尝试编写一个bigint类而不是使用long double? 检查一下:
答案 2 :(得分:0)
你知道你需要处理的最大值是多长时间?
我问,因为我注意到gcc在某些平台上支持128位整数:
http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html
所以你可能会非常幸运,如果你能够获得支持128位长的平台和最新的gcc。