Java 检查电源实现中的溢出

Java 检查电源实现中的溢出,java,overflow,pow,Java,Overflow,Pow,这是一个常见的面试问题。我想知道最快的方法是什么,以找出是否发生溢出(使用日志函数太慢)。 这是一个好的说法吗 double tempMult= aAbs*aAbs; if (tempMult >= aAbs) tempAnswer = pow(tempMult, bAbs / 2); else //overflow 浮点类型不会溢出,它们“刷新到无穷大”(行为由IEEE-754定义/强制)。溢出情况在机器代码级别(通过处理器标志等)是可检测的,但这显然不是高级语言的选项。只

这是一个常见的面试问题。我想知道最快的方法是什么,以找出是否发生溢出(使用日志函数太慢)。 这是一个好的说法吗

double tempMult= aAbs*aAbs;
if (tempMult >= aAbs) 

   tempAnswer = pow(tempMult, bAbs / 2);

else
//overflow

浮点类型不会溢出,它们“刷新到无穷大”(行为由IEEE-754定义/强制)。溢出情况在机器代码级别(通过处理器标志等)是可检测的,但这显然不是高级语言的选项。只能检查结果是否为+/-无穷大(Double.isInfinite(arg))

因此,您显示的代码永远不会检测到aAbs*aAbs的溢出;除NaN参数外:

如果aAbs为负值并溢出,则tempMult变为+无穷大, 如果aAbs为正并溢出,则tempMult变为+无穷大, 如果aAbs已为+/-无穷大,则tempMult变为+无穷大,并且 如果aAbs为NaN,则tempMult也将变为NaN。如果aAbs足够小,则表达式也可以下溢(aAbs*aAbs==0),但这不会导致任何问题

在NaN情况下,“(tempMult>=aAbs”的计算结果为false,因此检测到溢出的唯一情况是NaN参数,这可能也不是您想要的

这将给出合理的结果,但它仍然不会处理值+/-无穷大或NaN的参数(如果需要,您需要显式处理这些参数):

因此,要处理所有可能发生的情况:

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);
}

很容易说是的,但是这里没有定义溢出的行为。它只是取MAX_数的模吗?它会截断,可能导致负数吗?它会引发Java风格的异常吗?您是如何定义aAbs和bAbs的?更具描述性的变量名是自我记录的好方法。Java返回无限当Math.pow函数发生溢出时(例如Math.pow((Double.MAX_值),2))油嘴滑舌的时刻:“这与中国的茶叶价格有什么关系?”。这是返回的结果,但这不是实际数学的结果。溢出在哪里?“aAbs*aAbs”可能已经产生溢出,甚至没有进入pow().什么是变量类型?你是对的Durandal,在调用pow之前必须进行检查
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);
}