在pow()中执行双数组时输出错误

时间:2015-04-09 06:19:16

标签: c arrays double pow

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *infile, *outfile;
int main(){
    double landa, mu, lo, blocking_prob[4], mean_arrival_rate,
           mean_service_rate, k[4], p[4];

    infile = fopen("mm1.in", "r");
    outfile = fopen("mm1.out", "w");

    fscanf(infile, "%d %d %d %d %d %d",
        &mean_arrival_rate, &mean_service_rate,
        &k[0],&k[1],&k[2],&k[3] );

    lo = mean_arrival_rate / mean_service_rate;

    fprintf(outfile,
        "Initial setting : mean_arrival_rate = %d , mean_service_rate = %d \n\n",
        mean_arrival_rate,mean_service_rate);
    for(int x=0;x<4;x++) {
        printf("%f \n",pow(lo,k[x]) );
        blocking_prob[x]= ( (1-lo)*pow(lo,k[x]) ) / (1- pow(lo,k[x]+1));
        fprintf(outfile,"Blocking Probability is %f when K = %d \n\n",
            blocking_prob[x],k[x]);
    }
}

输出从 pow(lo,k [x])开始,输出错误的数字。

我试图用const替换k [](例如 pow(lo,5)),并且它是正确的。

有没有解决方案?

2 个答案:

答案 0 :(得分:1)

%d 不是双精度的正确scanf格式说明符。您需要使用%lf代替 1

如果您在阅读之后打印出k[]的值,您会发现它们与您的预期完全不同。

例如,请考虑以下程序:

#include <stdio.h>

int main (void) {
    double d1, d2;
    printf ("> ");
    scanf ("%lf %d", &d1, &d2); // one right, one wrong.
    printf ("Input was: %f %f\n", d1, d2);
    return 0;
}

运行它会给你:

pax$ ./testprog
> 3.14159 2.71828
Input was: 3.141590 -0.000000

1 C11 7.21.6.2 The fscanf function /10说得最好:

  

如果 [接收值的对象] 没有合适的类型,或者无法在对象中表示转换结果,则行为未定义

答案 1 :(得分:0)

您需要使用%lf的{​​{1}}格式说明符,而不是double

%d