所以我需要很多不同的表文件,并决定尝试用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);
}
答案 0 :(得分:2)
作为 cited here , and here ,`+ / - inf或nan由以下操作生成:
1/0 =∞
log(0)= - ∞
sqrt(-1)= NaN
使用比率和/或指数运算时,应始终在代码中包含检查,以排除此类操作处理的异常值。
浏览代码中生成inf
或nan
值的部分,确定如何为比率或函数分配不正确的值,并解决它们。 (例如,通过使用非法值测试来包围该部分代码,并设置条件以在存在这样的值时绕过操作。)
请注意接受和使用+/-∞
和NaN
的值之间的区别。
使用它们时,基本操作和数学函数都接受∞
和NaN
并产生合理的输出。但是,∞会像人们期望的那样通过计算传播:例如,2 + ∞
= ∞;
,4/∞;
= 0
,atan (∞)
= pi;/2
。
NaN
会感染任何涉及它的计算。除非计算产生相同的结果,无论替换NaN
的实际值是什么,结果都是NaN
。 (改编自上面的第二个链接)。