这是一个相当理论化的问题,因此虽然该语言专门针对 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 形式的硬件支持。 .
关于java - 动态 Java 整数/长溢出检查与性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6721316/