为什么在Java中-Infinity +Infinity的平方根?
2022-09-01 05:44:49
我尝试了两种不同的方法来查找Java中的平方根:
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity
为什么第二种方式不返回预期的答案(与第一种方式相同)?NaN
我尝试了两种不同的方法来查找Java中的平方根:
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity
为什么第二种方式不返回预期的答案(与第一种方式相同)?NaN
返回NaN(根据IEEE 754),以便在获得真正未定义的(中间)结果时继续计算。返回无穷大,以便在发生溢出后继续计算。
因此,行为
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
之所以指定,是因为已知(轻松快速地)已生成未定义的值;仅基于参数的符号。
但是表达式的计算
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity
遇到溢出和无效操作。然而,无效操作识别严重依赖于第二个参数的确定的准确性。如果第二个参数是先前舍入操作的结果,则它可能不完全是 0.5。因此,返回不太严重的确定,即对溢出的识别,以避免结果对第二个参数的准确性的严重依赖。
有关 IEEE 754 标准背后的一些推理的更多详细信息,包括返回标志值而不是生成异常背后的原因,请参阅
每个计算机科学家都应该知道的浮点算术(1991年,大卫戈德堡),
这是 附录 D