C 中的 Pow 函数输出零
Pow function in C is outputting zero
我正在编写一个集成脚本,它使用了一个不均匀的网格。我在 math.h 中使用 pow 函数来计算 x 的每个值应该乘以多少才能得到 x 的下一个值(这个值在我的代码中是 xmult)。然而,出于某种原因,我的 pow 函数输出零,即使我的计算器说它不应该。以下是我的代码中的相关片段:
#include "stdio.h"
#include "math.h"
...
int N = 10240;
double recN = 1/N;
double upperlim = 4;
double lowerlim = 0.0001;
double limratio = upperlim/lowerlim;
double xmult;
xmult = pow(limratio,recN);
printf("%e\n",xmult);
尽管我的计算值没有四舍五入,但 printf 函数的输出是 1.000000e+00。我在带有 -lm 标志的 CentOS 上使用 gcc 进行编译,如果没有设置该标志,它不会编译。如果有更多帮助,完整代码如下(程序的最终输出为 0.000000e+00)。
#include "stdio.h"
#include "math.h"
int main() {
int N = 10240;
double recN = 1/N;
double pi = M_PI;
double upperlim = 4;
double lowerlim = 0.0001;
double limratio = upperlim/lowerlim;
double h;
double f;
double fnext;
double ftot = 0;
double ftot2 = 0;
double x=lowerlim;
double xmult;
double xnext;
int i;
double func(double x){
return sin(x) * exp(-x);
}
fnext = func(lowerlim);
xmult = pow(limratio,recN);
printf("%e\n",xmult);
for (i=0;i<N;i++){
f = fnext;
fnext = func(x*xmult);
xnext = x * xmult;
h = xnext - x;
ftot = 0.5*h*(f+fnext);
ftot2 = ftot2 + ftot;
x = xnext;
}
printf("%e\n",ftot2);
}
很有可能,您的问题是在 C 中处理数字时的常见错误。考虑一下:
double recN = 1/N;
在这里,您将变量定义为double,然后执行整数除法。如果 N>1
那么这将导致零。
相反,查找您进行过此类计算的位置并将其转换为:
double recN = 1.0/N;
int N = 10240;
double recN = 1/N;
1
和N
都是int
类型,所以除法是整数除法,四舍五入为整数。因此 1/N
是 0
.
你可能想要 double recN = 1.0/N;
。
我正在编写一个集成脚本,它使用了一个不均匀的网格。我在 math.h 中使用 pow 函数来计算 x 的每个值应该乘以多少才能得到 x 的下一个值(这个值在我的代码中是 xmult)。然而,出于某种原因,我的 pow 函数输出零,即使我的计算器说它不应该。以下是我的代码中的相关片段:
#include "stdio.h"
#include "math.h"
...
int N = 10240;
double recN = 1/N;
double upperlim = 4;
double lowerlim = 0.0001;
double limratio = upperlim/lowerlim;
double xmult;
xmult = pow(limratio,recN);
printf("%e\n",xmult);
尽管我的计算值没有四舍五入,但 printf 函数的输出是 1.000000e+00。我在带有 -lm 标志的 CentOS 上使用 gcc 进行编译,如果没有设置该标志,它不会编译。如果有更多帮助,完整代码如下(程序的最终输出为 0.000000e+00)。
#include "stdio.h"
#include "math.h"
int main() {
int N = 10240;
double recN = 1/N;
double pi = M_PI;
double upperlim = 4;
double lowerlim = 0.0001;
double limratio = upperlim/lowerlim;
double h;
double f;
double fnext;
double ftot = 0;
double ftot2 = 0;
double x=lowerlim;
double xmult;
double xnext;
int i;
double func(double x){
return sin(x) * exp(-x);
}
fnext = func(lowerlim);
xmult = pow(limratio,recN);
printf("%e\n",xmult);
for (i=0;i<N;i++){
f = fnext;
fnext = func(x*xmult);
xnext = x * xmult;
h = xnext - x;
ftot = 0.5*h*(f+fnext);
ftot2 = ftot2 + ftot;
x = xnext;
}
printf("%e\n",ftot2);
}
很有可能,您的问题是在 C 中处理数字时的常见错误。考虑一下:
double recN = 1/N;
在这里,您将变量定义为double,然后执行整数除法。如果 N>1
那么这将导致零。
相反,查找您进行过此类计算的位置并将其转换为:
double recN = 1.0/N;
int N = 10240;
double recN = 1/N;
1
和N
都是int
类型,所以除法是整数除法,四舍五入为整数。因此 1/N
是 0
.
你可能想要 double recN = 1.0/N;
。