gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:02 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com