java - NaN 的问题

标签 java double

我的代码出现问题已有两周了,并且调试失败。我来这里是希望有人能提供帮助。我编写了一个程序,利用 Barnes-Hut 算法进行多体引力模拟。我的问题是一个或多个“粒子”将被分配 {NaN, NaN, NaN} 的位置(使用三个 double 来表示 3-d 空间的 x, y, z)。这反过来又导致其他粒子具有 {NaN, NaN, NaN} 的加速度,进而导致 {NaN, NaN, NaN} 的速度和位置。基本上,一两帧之后,一切都会消失。它似乎发生在 updateAcc 方法中,但我有一种感觉,事实并非如此。我知道这是一项艰巨的任务,非常感谢任何帮助我的人。 我检查过的内容: 不存在负平方根,并且所有值似乎都在其范围内。 源码可获取here 。再次感谢。

似乎产生 NaN 的代码:

private static void getAcc(particle particle, node node)
{
    if ((node.particle == null && node.children == null) || node.particle == particle)
    {
        //Geting gravity to a node that is either empty or the same node...
    }
    else if (distance(node.centerOfMass, particle.position) / node.sideLength > theta && node.children != null)
    {
        for (int i = 0; i < node.children.length; i++)
        {
            if (node.children[i] != null)
            {
                getAcc(particle, node.children[i]);
            }
        }
    }
    else
    {
        particle.acceleration = vecAdd(particle.acceleration, vecDiv(getForce(particle.position, particle.mass, node.centerOfMass, node.containedMass), particle.mass));
    }
}
private static double sumDeltaSquare(double[] pos1, double[] pos2)
{
    return Math.pow(pos1[0]-pos2[0],2)+Math.pow(pos1[1]-pos2[1],2)+Math.pow(pos1[2]-pos2[2],2);
}
private static double[] getForce(double[] pos1, double m1, double[] pos2, double m2)
{
    double ratio = G*m1*m2;
    ratio /= sumDeltaSquare(pos1, pos2);
    ratio /= Math.sqrt(sumDeltaSquare(pos1,pos2));
    return vecMul(vecSub(pos2, pos1), ratio);
}
private static double distance(double[] position, double[] center)
{
    double distance = Math.sqrt(Math.pow(position[0]-center[0],2) + Math.pow(position[1]-center[1],2) + Math.pow(position[2]-center[2],2));
    return distance;
}

最佳答案

我不确定这是否是唯一的问题,但这是一个开始。

sumDeltaSquare 有时会返回 0,这意味着当在 getForce ratio/= sumDeltaSquare(pos1, pos2); 中使用该值时,它将产生无穷大并开始引起问题。

这是一个严重的问题,您需要调试并弄清楚一切的含义。不过我很喜欢看这些点。

关于java - NaN 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711760/

相关文章:

java - 从命令行创建 Java 包的正确方法是什么? (Maven 的麻烦)

java - 是否有一种方法可以解析 int 或如果无法解析则返回 0?

java - fragment 类在 Intent 的 startactivity 方法中显示错误

java - Cron 表达式到日期/时间点列表

python - 将 C++ double 返回给 Python?

java - 我的程序在没有扫描字符串的情况下终止

java - JSpinner - 奇数步长

c++ - 关于 float 舍入错误

java - double 和 int 的算法速度?

arrays - 将 2d 字符串数组转换为 double swift 的 2d 数组