C ++ nan不断推出集成

时间:2015-04-05 18:12:23

标签: c++ math integration

我正在尝试运行集成程序,但在计算时我一直在努力。我不知道我的代码有什么问题。

    #include <iostream>
    #include <cmath>
    using namespace std;


    int main(){
cout << "For integration up \n";
   for (int z=0; z<=5; z++){
   int i=1;
   float nathan [6] = {pow(10,2), pow(10,3), pow(10,4), pow(10,5),pow(10,6), pow(10,7)};
   int h= nathan[z];
   int n=0;
   double x= (h-i)/h;
   double y= (h-i)/h;
   double t= 0;


   while(n <= h){


     if(n == 0){
    t += (x/3)*(1/y);
  }else if(n==h){
     t+= (x/3)*(1/y);
  }else if(n%2 ==1){
        t+= (4*x/3)*(1/y);
        }else{t+= (2*x/3)*(1/y);
        }

y= x+y;
n = n+1;
   }

   cout << "The integration of 1/x for N = "<< nathan[z] <<" is equal to " << t << endl;

   }

   }

有人可以帮我解决这个问题......

2 个答案:

答案 0 :(得分:2)

使用

int i = 1;
int h = nathan[z];

术语

(h - i) / h

调用整数除法,由于h - ih都是正数且h - i小于h,因此会产生整数零。

double x= (h-i)/h;
double y= (h-i)/h;

然后,xy都为零,并且从那里开始所有术语

  if(n == 0){
    t += (x / 3) * (1 / y);
  } else if(n == h) {
    t += (x / 3) * (1 / y);
  } else if(n%2 == 1) {
    t += (4 * x / 3) * (1 / y);
  } else {
    t += (2 * x / 3) * (1 / y);
  }

导致零次无穷大,这不是数字(即,nan)。一旦你在那个下沉洞中,你永远不会回来。

h成为double以避免这种情况。

附注:请了解如何正确缩进代码。如果你不这样做,你最终的同事会为你活着,他们会是对的。

答案 1 :(得分:0)

这是因为你的代码中x和y总是0,因为h是int。当你执行(h-i)/ h时,编译器假定(h-i)是int而h也是int,所以它也假设比率的结果是int。这个比例介于0和1之间,所以当你只用int表示它时,它只是0.然后只有编译器将此值转换为double,然后保持为0。 试试:

   double x= (h-i)/(double)h;
   double y= (h-i)/(double)h;