所以我需要很多不同的表文件,并决定尝试用C来创建它们。代码通常会做它应该做的事情,但我在2.和3. cloumns中得到了-nan和-inf (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);
}发布于 2018-02-12 21:20:00
As 、、`+/-inf或nan是通过如下操作生成的:
1/0 =∞
log (0) = -∞
sqrt (-1) = NaN
在使用比率和/或指数运算时,应始终在代码中包含检查,以排除异常值,使其不被此类运算处理。
遍历代码中生成inf或nan值的部分,确定如何为比率或函数分配不正确的值,并解决它们。(例如,通过用非法值的测试包围这段代码,并设置一个条件,以便在出现这样的值时绕过操作。)
请记住接受和使用+/-∞和NaN的值之间的区别。
在使用它们时,基本的操作和数学函数都接受∞和NaN并产生合理的输出。但是,正如预期的那样,∞通过计算进行传播:例如,2 + ∞ = ∞;,4/∞; = 0,atan (∞) = pi;/2。
另一方面,NaN会影响涉及到它的任何计算。除非无论用什么实值替换NaN,计算都会产生相同的结果,否则结果是NaN。(改编自上面的第二个链接)。
https://stackoverflow.com/questions/48747113
复制相似问题