您好我在一段java代码中有以下等式:
double z = 0.002378 * (Math.pow((1 - (Math.pow(6.875, -6) * y)), 4.2561));
当我将y设置为非常大的值时,即200000
我得到Nan
(不是数字)它的值稍微低一些,130000
谁能告诉我为什么会这样?
此外,我试图从原始的BASIC程序中移植上述代码:
.002378*(1-(6.875*10^-6*ALT))^4.2561
我可能做错了? BASIC代码
中的操作顺序不是很明确由于
答案 0 :(得分:3)
正如the Javadoc for Math.pow
所解释的那样:
如果第一个参数是有限且小于零[...]并且第二个参数是有限的而不是整数,那么结果是NaN。
因此,只要您的y
足够强大,1 - (Math.pow(6.875, -6) * y
为负数,您就会获得NaN。
(当你考虑基础数学时这是有道理的。非整数幂的负数不是实数,而double
无法表示复数。)
修改了更新的问题:
您的基本代码有6.875*10^-6
(意思是6.875×10 -6 ),但您的Java代码有Math.pow(6.875, -6)
(意思是6.875 -6 ),这是一个更大的值,因此您的Java代码会针对较小的y
值触发此问题。这可能就是你现在看到这个问题的原因。要匹配基本代码,您应将Math.pow(6.875, -6)
更改为6.875e-6
。
答案 1 :(得分:0)
将负数提升为非整数幂导致复数数学中的虚数,即Java算术中的NaN。如果您确实需要进行该计算,则需要复杂的数字包。但是,您的等式中更可能存在错误,或者您试图在其有效范围之外使用它。
答案 2 :(得分:0)
实数幂的负数可能会达到NAN