这是一个常见的面试问题implement the power function 。我想知道最快的方法是找出是否发生溢出(使用日志函数太慢)。 这是一个好说法吗
double tempMult= aAbs*aAbs;
if (tempMult >= aAbs)
tempAnswer = pow(tempMult, bAbs / 2);
else
//overflow
最佳答案
浮点类型不会溢出,它们“刷新到无穷大”(该行为由 IEEE-754 定义/强制)。溢出条件可以在机器代码级别检测到(通过处理器标志等),但这显然不是高级语言的选择。您只能检查结果是否不是 +/- 无穷大 (Double.isInfinite(arg))。
因此,您显示的代码永远不会检测到 aAbs*aAbs 的溢出;除了 NaN 参数:
如果 aAbs 为负值并溢出,tempMult 变为 +INFINITY, 如果 aAbs 为正并溢出,tempMult 变为 +INFINITY, 如果 aAbs 已经是 +/- INFINITY tempMult 变为 +INFINITY 并且 如果 aAbs 为 NaN tempMult 也变为 NaN。如果 aAbs 足够小,则表达式也可能下溢 (aAbs * aAbs == 0),但这不会导致任何问题。
在 NaN 情况下,“(tempMult >= aAbs”计算结果为 false,因此您检测为溢出的唯一情况是 NaN 参数,这可能也不是您想要的。
这应该会给出合理的结果,但是它仍然不会处理值 +/-INFINITY 或 NaN 的参数(如果需要,您需要显式处理这些):
double tempMult= aAbs*aAbs;
if (Double.isInfinite(tempMult)) {
// overflow
} else {
answer = pow(tempMult, bAbs / 2);
}
因此,要处理所有可能性:
if (Double.isNaN(aAbs) {
// NaN
} else if (Double.isInfinite(aAbs)) {
// Infinity argument
}
double tempMult= aAbs*aAbs;
if (Double.isInfinite(tempMult)) {
// overflow
} else {
answer = pow(tempMult, bAbs / 2);
}
关于java - 检查电源实现中的溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434148/