奇怪的结果使用内循环儿童方法在C

问题描述:

我想打印出Fobonacci序列根据用户想要多少个数字。即如果用户输入5,则输出将是1,1,2,3,5。所以我在一个普通的C程序中设置一个循环来执行此操作:奇怪的结果使用内循环儿童方法在C

for(int m=1; m<=a;m++) 
    { 
    i = (pow(c, m)-(pow(v, m)))/b; 
    printf("%d\n",(int)round(i)); 
    } 

这个for循环给了我期望的输出。但是,当我将它放入fork方法的子进程中时,输出会发生变化。即如果用户输入5,则输出将是1,0,2,2,5。为什么是这样?有没有办法解决它?这里是我的代码:

#include <unistd.h> 
#include <stdio.h> 
#include <sys/wait.h> 
#include <math.h> 

int var_glb; /* A global variable*/ 

int main(void) 
{ 
    pid_t childPID; 
    double a; 
    double c = 1.6180339; 
    double v = -0.6190339; 
    double b = 2.236067977; 
    int i; 


    childPID = fork(); 

    if(childPID >= 0) // fork was successful 
    { 
     if(childPID == 0) // child process 
     { 
      printf("\nEnter the first value:"); 
      scanf("%lf", &a); 
      for(int m=1; m<=a;m++) 
      { 
       i = (pow(c, m)-(pow(v, m)))/b; 
       printf("%d\n",(int)round(i)); 
      } 
     } 
     else //Parent process 
     { 
      wait(NULL); 

      printf("\nThis is the parent process running"); 
      return 0; 
     } 
    } 
    else // fork failed 
    { 
     printf("\n Fork failed, quitting!!!!!!\n"); 
     return 1; 
    } 

    return 0; 
} 
+0

这不是计算斐波那契数的好方法。实际上,你几乎不应该使用浮点运算来计算可以用纯整数算术表达的东西,以保证正确性和性能。试试'double fib =(pow(c,m) - pow(v,m))/ b; printf(“%f \ n”,fib);'看看发生了什么。 – 5gon12eder 2014-10-16 19:35:11

我会通过固定支架的开始:i = (pow(c, m)-pow(v, m))/b;你也不能指望iint ... ifloatdouble

+0

而这就是问题:当该表达式被分配给变量'i'时,结果被截断为整数。它需要被舍入。 – 2014-10-16 19:29:03

你的问题是不相关的分叉。如果所有的分支都被注释掉了,那么程序产生完全相同的结果,并且所有的东西都在父进程中运行。显然,该算法在某些方面是不正确的。

因此我发现问题在于我将变量i声明为int而不是double,就像我在另一个应用程序中所做的一样,感谢您的帮助,但我一定会使用所有的建议来加强我的码。