Pra*_*tik 35 java math floating-point ieee-754
我尝试了两种不同的方法来在Java中找到平方根:
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity
Run Code Online (Sandbox Code Playgroud)
为什么第二种方式不能返回预期的答案NaN
(与第一种方式相同)?
Pie*_*ens 48
甲的NaN是为了继续进行计算时已经获得一个真正的未定义(中间)结果返回(下IEEE 754).一个无限大的,以便继续计算已发生溢出后返回.
这样的行为
Math.sqrt(Double.NEGATIVE_INFINITY); // NaN
Run Code Online (Sandbox Code Playgroud)
指定是因为已知(容易且快速)已生成未定义的值; 完全基于论证的标志.
但是评价表达方式
Math.pow(Double.NEGATIVE_INFINITY, 0.5); // Infinity
Run Code Online (Sandbox Code Playgroud)
遇到溢出和无效操作.然而,无效操作识别主要取决于确定第二个参数的准确程度.如果第二个参数是先前舍入操作的结果,那么它可能不完全是 0.5.因此,返回不太严重的确定,识别溢出,以避免结果对第二自变量的准确性的严重依赖.
有关IEEE 754标准背后的一些推理的其他详细信息,包括返回标志值而不是生成异常的原因,可在
每个计算机科学家应该知道的浮点运算(1991,David Goldberg),
这是附录D.
pie*_*t.t 30
它只是按照文档中描述的那样行事Math
.
用于Math.sqrt
:
如果参数为NaN或小于零,则结果为NaN.
用于Math.pow
:
如果
- 第一个参数是负零,第二个参数小于零但不是有限的奇数,或者
- 第一个参数是负无穷大,第二个参数大于零但不是有限的奇数,
然后结果是正无穷大.
至于他们为什么做出这样的设计选择 - 你将不得不问java的作者.
归档时间: |
|
查看次数: |
3521 次 |
最近记录: |