Java 从数学方程出发
嗨,我在一段java代码中有以下等式:Java 从数学方程出发,java,double,nan,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 我可能做错了?基本代码中的操作顺序不是很明确 感谢
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
我可能做错了?基本代码中的操作顺序不是很明确
感谢解释如下:
如果第一个参数是有限的且小于零[…并且]第二个参数是有限的且不是整数,则结果为NaN
因此,只要你的y
足够好,以至于1-(Math.pow(6.875,-6)*y
为负值,你就会得到NaN
(这是有意义的,当你考虑基础数学。一个非整数幂的负数不是实数,而<代码>双< /代码>无法表示复数。)
为更新的问题编辑: 您的基本代码为
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
,如下所述:
如果第一个参数是有限的且小于零[…并且]第二个参数是有限的且不是整数,则结果为NaN
因此,只要你的y
足够好,以至于1-(Math.pow(6.875,-6)*y
为负值,你就会得到NaN
(这是有意义的,当你考虑基础数学。一个非整数幂的负数不是实数,而<代码>双< /代码>无法表示复数。)
为更新的问题编辑:
您的基本代码为
6.875*10^-6
(表示6.875×10−6) ,但是您的Java代码有Math.pow(6.875,-6)
(意思是6.875−6) ,这是一个稍大的值,因此您的Java代码触发此问题的原因是y
的值稍小。这可能就是您现在看到此问题的原因。要匹配基本代码,您应该更改Math.pow(6.875,-6)
to6.875e-6
在复数数学中,将负数提升为非整数次幂会产生一个虚数,在Java算术中是一个NaN。如果您确实需要进行该计算,则需要一个复数包。但是,更可能的情况是,您的等式中存在错误或您正试图使用它超出其有效范围。将负数提高为非整数幂会导致复数数学中的虚数,Java算术中的NaN。如果确实需要进行该计算,则需要一个复数包。但是,更可能的情况是,等式中存在错误,或者您正试图将其用于超出其有效范围。负数加实数幂可能得到NAN负数加实数幂可能得到NAN你知道^
是逻辑异或,而不是幂函数?你可能在寻找数学.pow()
方法。该代码甚至不会编译。请发布您的真实代码。这不是java代码,我使用标准数学符号编写了方程添加了实际代码OK,您应该检查Math.pow
(并了解是什么情况导致它返回NaN
):。你知道^
是逻辑异或,而不是幂函数吗?你可能在寻找数学.pow()
方法。该代码甚至不会编译。请发布您的真实代码。这不是java代码,我使用标准数学符号编写了方程添加了实际代码OK,您应该检查Math.pow
(并了解是什么情况导致它返回NaN
):。它似乎有一个140000左右的最大限制,但我想这是等式的一个限制,我的实现不再有问题。希望它的最大限制是140000左右,但我想这是等式的一个限制,我的实现不再有问题。希望如此