南从数学方程

时间:2013-03-17 16:13:16

标签: java double nan

您好我在一段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代码

中的操作顺序不是很明确

由于

3 个答案:

答案 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