【问题标题】:NaN error JAVA when multiplying by 0乘以 0 时出现 NaN 错误 JAVA
【发布时间】:2018-09-06 03:34:42
【问题描述】:

我真的不明白为什么这个表达式只有在

acceleration.module - Ambient.friction = 0

double x = (speed.module * speed.direction.x()) + ((acceleration.module-Ambient.friction) * acceleration.direction.x())*time;

此外,如果我像这样添加穿刺术:

double x = ((speed.module * speed.direction.x()) + ((acceleration.module-Ambient.friction) * acceleration.direction.x()))*time;

它又给了我一个 NaN 错误。

【问题讨论】:

标签: java nan


【解决方案1】:

在第一个中,第二个值乘以时间。

double x = (speed.module * speed.direction.x()) + ((acceleration.module-Ambient.friction) * acceleration.direction.x())*time;

另一方面,整件事乘以时间:

double x = ((speed.module * speed.direction.x()) + ((acceleration.module-Ambient.friction) * acceleration.direction.x()))*time;

这让我觉得你在第二个中溢出了双值,然后再随着时间的推移而倍增。使用双溢出,您将获得神奇的值 Double.POSITIVE_INFINITY 或 Double.NEGATIVE_INFINITY

您很可能将时间与 Double.POSITIVE_INFINITY 或 Double.NEGATIVE_INFINITY 相乘,结果为 NAN。

将计算更改为一系列步骤。对于每一步,通过查找 Double.POSITIVE_INFINITY 或 Double.NEGATIVE_INFINITY 检查结果是否溢出。这会告诉你事情在哪里出轨。您几乎可以肯定在某处溢出,但我们看不到您正在处理的数字,因此我无法告诉您确切的位置。

【讨论】:

  • 感谢您的回答。我正在使用适用于 Android 的 OpenGL ES 构建这个程序,我注意到有时 2 帧之间经过的时间被评估为 0.0(我不知道为什么,我稍后会检查)。出于这个原因,当这种情况发生时,我会得到一个 -0.0 值,这会产生问题(我认为)。
  • 是的,你也应该检查那个数字,一旦你有了这个数字,你可能无法乘以或添加它,或者它最终也会给你 NAN:stackoverflow.com/questions/6724031/… 有时对于像这样的问题这种重新排列计算顺序可以避免这个问题。
  • 一旦你完成了一系列单独的步骤,这个参考可以作为参考programgo.com/article/4441958781看看你如何以NAN结尾
【解决方案2】:

我的(受过教育的)猜测是 nan 已经在这个方向上,因为当模块为零时它将是不确定的

【讨论】:

    猜你喜欢
    • 2017-02-06
    • 2018-10-12
    • 2013-06-22
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2019-05-02
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多