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;

1N都是int类型,所以除法是整数除法,四舍五入为整数。因此 1/N0.

你可能想要 double recN = 1.0/N;