我尝试了两种不同的方法来在Java中找到平方根:
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity为什么第二个方法不返回预期的答案,即NaN (与第一个方法相同)?
发布于 2017-12-29 14:08:33
返回NaN (在IEEE 754下),以便在获得真正未定义(中间)结果时继续计算。返回无穷大,以便在发生溢出后继续计算。
这样的行为
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN之所以指定此值,是因为已知(轻松和快速)已经生成了一个未定义的值;仅基于参数的符号。
然而,对表达式的评估
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity同时遇到溢出和无效操作。然而,无效操作识别在很大程度上取决于第二个参数的确定是否准确。如果第二个参数是先前舍入操作的结果,那么它可能不是 0.5。因此,返回不太严重的判断,即对溢出的识别,以避免结果对第二个参数的准确性的临界依赖。
有关IEEE 754标准背后的一些推理的其他详细信息,包括返回标志值而不是生成异常的推理,可在
,
的附录D。
发布于 2017-12-29 09:14:01
它的作用就像“文档 of Math”中描述的那样。
对于Math.sqrt
如果参数为NaN或小于零,则结果为NaN。
对于Math.pow
如果
则结果为正无穷大。
至于他们为什么要做出这样的设计选择--你得问一下java的作者。
https://stackoverflow.com/questions/48020069
复制相似问题