动态Java整数/长溢出检查与性能

这是一个相当理论化的问题,因此虽然语言是专门的
Java,但任何通用的解决方案都足够了.

假设我想编写一个简单的阶乘函数:

long factorial(int n)
{
    //handle special cases like negatives, etc.

    long p = 1;
    for(int i = 1; i <= n; i++)
    {
        p = p * n;
    }
    return p;
}

但是现在,我还想检查阶乘是否溢出(不需要简单地硬编码MAX_FACTORIAL_PARAMETER或类似的东西).通常,在乘法期间检查溢出就像检查原始输入的结果一样简单,但在这种情况下,由于溢出可能在任何点发生,因此在每个循环中执行更多的除法和比较会相当昂贵.

那么问题是双重的 – 有没有办法解决溢出的阶乘问题而不检查每一步的乘法溢出或硬编码最大允许参数?

总的来说,我应该如何处理涉及迭代/递归的多个阶段的问题,这些阶段可能会在每个阶段无声地失败而不会通过在每个阶段引入昂贵的检查来影响性能?

最佳答案 虽然Java对此没有帮助,但肯定有一些语言可以帮助解决溢出问题.例如,C#提供
checked keyword.在下面,此功能可能使用
overflow flag形式的硬件支持.

点赞