输入变量的函数返回-nan和-inf

时间:2018-02-12 12:59:33

标签: c

所以我需要很多不同的表文件,并决定尝试用C创建它们。代码一般来说它应该是什么,但我在2.和3中得到-nan和-inf。 cloumns(4-7工作正常)。

4.0000000000e-02 -nan -inf
4.2000000000e-02 -nan -inf
4.4000000000e-02 -nan -inf

这些列中的值来自带有输入变量的函数,因此我可能在定义它们时出错了。因为这是我在C中做的第一件事,我确定我犯了一个非常愚蠢的错误,所以提前感谢。

这是代码

#include <stdio.h>
#include <math.h>

main()
{

    FILE    *fout;
    double e,o,k,c,r;

    printf("Define the relative dielectric constant:\n");
    scanf("%d",&e);

    printf("Define the cutoff radius:\n");
    scanf("%d",&o);

    k = (78-e)/(pow(o,3)*(156+e));
    c = (1/o)+k*pow(o,2);

    fout = fopen("table_XX_XX.xvg", "w");
    fprintf(fout, "#\n# Tabulated Potential for AA-AA Interactions\n#\n");

    for (r=0; r<=3; r+=0.002) {

        double f = ((1/r)+k*pow(r,2)-c)/e;
        double fprime = (pow(r,-2)-2*k*r)/e;

        double g = -1/(pow(r,6));
        double gprime = -6/(pow(r,7));

        double h = 1/(pow(r,12));
        double hprime = 12/(pow(r,13));

        /* print output */
        if (r<0.04) {
            fprintf(fout, "%12.10e   %12.10e %12.10e   %12.10e %12.10e   %12.10e %12.10e\n", r,0.0,0.0,0.0,0.0,0.0,0.0);
        } else {
            fprintf(fout, "%12.10e   %12.10e %12.10e   %12.10e %12.10e   %12.10e %12.10e\n", r,f,fprime,g,gprime,h,hprime);
        }
    }

    fclose(fout);
    return(0);
}

1 个答案:

答案 0 :(得分:2)

作为 cited here and here ,`+ / - inf或nan由以下操作生成:

1/0 =∞
log(0)= - ∞
sqrt(-1)= NaN

使用比率和/或指数运算时,应始终在代码中包含检查,以排除此类操作处理的异常值。

浏览代码中生成infnan值的部分,确定如何为比率或函数分配不正确的值,并解决它们。 (例如,通过使用非法值测试来包围该部分代码,并设置条件以在存在这样的值时绕过操作。)

请注意接受和使用+/-∞NaN的值之间的区别。

使用它们时,基本操作和数学函数都接受NaN并产生合理的输出。但是,∞会像人们期望的那样通过计算传播:例如,2 + ∞ = ∞;4/∞; = 0atan (∞) = pi;/2

另一方面,

NaN会感染任何涉及它的计算。除非计算产生相同的结果,无论替换NaN的实际值是什么,结果都是NaN。 (改编自上面的第二个链接)。