如何在不使用 BigInteger 和溢出的情况下对所有 long 值求和?

问题描述 投票:0回答:3

长值有很多,有正有负,位置和负值同时存在,我已经知道它们的总和永远不会溢出。

如何在不使用 BigInteger 的情况下对它们求和并获得正确的结果?

我试过先加一个正值再加一个负值,这样每次求和都不会溢出。 但是我必须将正值和负值分为两组,所以我认为这不是一个好的解决方案,如果所有值都由像 EventSourcing 这样的源生成怎么办?

java algorithm integer-overflow
3个回答
0
投票

我们可以使用Kahan_summation_algorithm。这是通过保持单独的运行补偿(一个累积小误差的变量)来完成的,实际上通过补偿变量的精度扩展了总和的精度

public static long compensatedSum(long[] values) {
    long sum = values[0];
    long comp = 0;

    for (int i = 1; i < values.length; i++) {
        long adjusted = values[i] - comp;
        long temp = sum + adjusted;
        comp = (temp - sum) - adjusted;
        sum = temp;
    }

    return sum;
}

补偿求和背后的基本思想是在将每个值添加到运行总和之前从每个值中减去补偿值。然后通过将原始值与调整值之间的差值添加到补偿值来更新补偿值。这种方法确保最终结果中的错误最小化。

注意:它在

Long.MAX_VALUE

中可以返回的最大值

-1
投票

您可以先尝试对它们进行排序。然后添加第一个和最后一个元素,第二个和第二个最后一个元素,依此类推,并得到这些数字的总和。


-1
投票

不幸的是,您将无法使用 BigInteger 求和。一种粗略的方法可能是使用

double
将所有数字相加。但是,由于精度浮点运算,这将导致结果不一致。

我建议,您可以使用 Sum 数据库如何求和。本质上,将所有 BigInteger 转换为字符串表示,然后从第一个主体进行加法。

示例:https://www.geeksforgeeks.org/sum-two-large-numbers/

© www.soinside.com 2019 - 2024. All rights reserved.