【问题标题】:Nan from maths equationNan来自数学方程
【发布时间】:2013-03-05 23:22:39
【问题描述】:

您好,我在一段 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 代码中的操作顺序不是很明确

谢谢

【问题讨论】:

  • 你知道^ 是逻辑异或,而不是幂函数吗?您可能正在寻找Math.pow() 方法。
  • 该代码甚至无法编译。请发布您的真实代码。
  • 这不是java代码,我用标准数学符号写了方程
  • 添加了实际代码
  • 好的,你应该检查Math.pow的规则(并了解是什么情况导致它返回NaN):docs.oracle.com/javase/6/docs/api/java/lang/…

标签: java double nan


【解决方案1】:

正如the Javadoc for Math.pow 解释的那样:

如果第一个参数是有限的并且小于零[...并且]第二个参数是有限的并且不是整数,那么结果是 NaN。

因此,只要您的 y 足够大以至于 1 - (Math.pow(6.875, -6) * y 为负数,您就会得到 NaN。

(当您考虑基础数学时,这是有道理的。负数的非整数幂不是实数,double 无法表示复数。)


针对更新的问题进行了编辑:

您的 Basic 代码有 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

【讨论】:

  • 它的最大限制似乎在 140000 左右,但我想这是等式的限制,不再是我的实现问题。希望
【解决方案2】:

将负数提高到非整数幂会导致复数数学中的虚数,Java 算术中的 NaN。如果你真的需要做那个计算,你需要一个复数包。但是,您的方程式更有可能存在错误,或者您试图在其有效范围之外使用它。

【讨论】:

    【解决方案3】:

    具有实数幂的负数可能会得到 NAN

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 2021-01-14
      • 1970-01-01
      • 2011-01-09
      • 2022-01-04
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多