java - 检查电源实现中的溢出

标签 java overflow pow

这是一个常见的面试问题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/

相关文章:

html - 无法在我的 Iframe 中滚动

c - 有没有办法概括 vscode 中程序特定的设置?

java - 为什么 Maven 版本会跳过我的子模块

JavaFX 按钮不随 Windows 字体大小设置缩放

jquery - 带有弹出窗口的 jQuery 垂直 slider 中的溢出隐藏问题

javascript - 使用 javascript 的平方根返回 ReferenceError

c - pow(1,0) 返回 0?

java - 在后台 15 分钟后完成应用程序

java - java字节码总是向前兼容吗?

html - 表格在 HTML 页面上溢出