【问题标题】:-1. #IND00 appearing without division?-1。 #IND00 出现没有分裂?
【发布时间】:2020-03-07 19:41:21
【问题描述】:

虽然我知道 -1.#IND00 表示我试图将某个值除以零,但我的程序给出了 -1.#IND00 而我没有进行任何除法。

我正在尝试编写一个记录晶格中粒子距离的代码,我告诉程序忽略它试图通过忽略该迭代来减去同一个粒子的位置的情况,然后继续下一个。但是,使用公式:

comparative_distance[par_num][current_par]=sqrt((position[current_par][0]-position[par_num][0])*(position[current_par][0]-position[par_num][0])+(position[current_par][0]-position[par_num][0])*(position[current_par][1]-position[par_num][1])+(position[current_par][2]-position[par_num][2])*(position[current_par][2]-position[par_num][2]));, 

这只是 sqrt(x^2+y^2+z^2),它给了我 -1.#IND00 的几个结果,我认为我们不能忽略这些情况,因为这些信息将被用于计算粒子间势和力(当把势相加时,我认为当需要将一个整数与 -1.#IND00 结果相加时,计算机将不知道该怎么做)。

也许我对 -1.#IND00 的含义有误解,但是输出想要说明 -1.#IND00 的含义是什么?

如果你需要看一下,这是整个代码(它还没有完成):

#include <stdlib.h>
#include <math.h>
#define Kb 8.6173324e-5 //Boltzmann constant (in eV/K)
#define PI 3.14159265
#define C 299792.458  // in angstrom/ps
#define temp 298 // in K
#define mass 3.72112e10 //in eV/c^2
#define upsilon 1.03e-2 //in eV
#define rho 3.4//in Angstrom

//Initialization
double Box_Muller_Transformationx(double box1) //this is the algorithm for Box-Muller transformation
{
    double vx = (sqrt(-2*log(box1))*cos(2*PI*box1))*sqrt(Kb*temp/mass);
    return vx;
}
double Box_Muller_Transformationy(double box2) //this is the algorithm for Box-Muller transformation
{
    double vy = (sqrt(-2*log(box2))*cos(2*PI*box2))*sqrt(Kb*temp/mass);
    return vy;
}
double Box_Muller_Transformationz(double box3) //this is the algorithm for Box-Muller transformation
{
    double vz = (sqrt(-2*log(box3))*cos(2*PI*box3))*sqrt(Kb*temp/mass);
    return vz;
}

int par_num = 125, b = 3, a=0, coordinates=3, current_par=124; //this is the lattice size, boundary is set as 10 in each direction
double t=0, box1, box2, box3;
int main()
{
    double i=0, j=0, k=0, vx=0, vy=0, vz=0; //generating the 125 particles as a 3D lattice with random velocities
    double velocity[125][3];
    double position[125][3];
    double potential[125][125];
    double comparative_distance[125][125];
    double v_new[125][3];
    double force[125][3];
    double rho_term[125][125];
    double each_total_V[par_num][1];
    double vx_sum;
    double vy_sum;
    double vz_sum;
    double vx_final;
    double vy_final;
    double vz_final;
    double r;
    //finding the altered velocities after initializing velocities
    for (par_num=0;par_num<125;par_num++)
    {
       vx_sum+=velocity[par_num][0];
       vy_sum+=velocity[par_num][1];
       vz_sum+=velocity[par_num][2];
    }
    vx_final=vx_sum/125;
    vy_final=vy_sum/125;
    vz_final=vz_sum/125;

    FILE *fp;
    fp = fopen ("lab2testing.txt", "w+");
    fprintf(fp, "%d \n%s \n", 125, "particle");

    for (i=0, par_num=0; par_num<125; i++, par_num++)
    {
            double box1 = (rand()/ (double)RAND_MAX);
            double box2 = (rand()/ (double)RAND_MAX);
            double box3 = (rand()/ (double)RAND_MAX);
            position[par_num][0]=i; //position components, i=-1 because if we want the particle to be placed at 0 again, but the big for-loop will generate i=1 unless we tune it down.
            position[par_num][1]=j;
            position[par_num][2]=k;
            double vx = Box_Muller_Transformationx(box1); //velocity components
            double vy = Box_Muller_Transformationy(box2);
            double vz = Box_Muller_Transformationz(box3);
            velocity[par_num][0]=vx;
            velocity[par_num][1]=vy;
            velocity[par_num][2]=vz;
            v_new[par_num][0]=velocity[par_num][0]-vx_final;
            v_new[par_num][1]=velocity[par_num][1]-vy_final;
            v_new[par_num][2]=velocity[par_num][2]-vz_final;
            if(par_num%5==4)
            {
                i=-1;
                j++;
            }

            if(par_num%25==24)
            {
                i=-1;
                j=0;
                k++;
            }

            if(par_num==125)
            {
                position[par_num][2]=5;
            }
            fprintf(fp, "%s %lf %lf %lf\n ","Ar", position[par_num][0], position[par_num][1], position[par_num][2]);
            printf("%s %lf %lf %lf\n ","Ar", position[par_num][0], position[par_num][1], position[par_num][2]);
    }

//Iteration......
double p,q;
        fprintf(fp, "%d \n%s \n", 125, "particle");
        for (coordinates=0; coordinates<3; coordinates++) //coordinates loop
        {
            for (par_num=0; par_num<125; par_num++)  //calculating for each particle
            {
                for (current_par=0; current_par<125; current_par++) //counting from 1st until 125th particle
                {
                    comparative_distance[par_num][current_par]=sqrt((position[current_par][0]-position[par_num][0])*(position[current_par][0]-position[par_num][0])+(position[current_par][0]-position[par_num][0])*(position[current_par][1]-position[par_num][1])+(position[current_par][2]-position[par_num][2])*(position[current_par][2]-position[par_num][2]));
                    if(comparative_distance[par_num][current_par]==0 || par_num==current_par)
                    {
                    continue;
                    }
                    rho_term[par_num][current_par] = rho/comparative_distance[par_num][current_par];
                    p = rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par];
                    q = rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par]*rho_term[par_num][current_par];
                    potential[par_num][current_par]=4*upsilon*(q-p);
                    printf("%lf\n", comparative_distance[par_num][current_par]);
                }
            }
        }


    return(0);
}

【问题讨论】:

    标签: c arrays loops if-statement


    【解决方案1】:

    打印的值-1.#IND00 通常表示浮点运算的结果是无穷大或非数字。在这种情况下,它恰好是后者。来自哪里是对sqrt 的调用。通过一些额外的格式,问题变得更加明显:

    comparative_distance[par_num][current_par]=sqrt(
      (position[current_par][0]-position[par_num][0])*(position[current_par][0]-position[par_num][0])+
      (position[current_par][0]-position[par_num][0])*(position[current_par][1]-position[par_num][1])+
      (position[current_par][2]-position[par_num][2])*(position[current_par][2]-position[par_num][2]));
    

    第二项不正确。你有 x*y 而不是 y^2。将其更改为:

    comparative_distance[par_num][current_par]=sqrt(
      (position[current_par][0]-position[par_num][0])*(position[current_par][0]-position[par_num][0])+
      (position[current_par][1]-position[par_num][1])*(position[current_par][1]-position[par_num][1])+
      (position[current_par][2]-position[par_num][2])*(position[current_par][2]-position[par_num][2]));
    

    【讨论】:

    • 我不敢相信!在过去的几个小时里,我一直在寻找问题,而您马上就看到了!这真是太棒了!一百万谢谢你\^O^/。所以-1.#IND00 也表示“不是数字”,嗯,x*y 好像不是数字,后面我会查原因。
    • @hyacinthchan x * y 可能没问题。很可能它很大程度上是负数,如果 x^2 + x * y + z^2
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多