4个变量的平均值用于打印“4.00000”(除以4)而不是实际平均值

时间:2018-01-24 16:11:36

标签: c function floating-point average

我想知道我是否使用了正确的变量类型。据我所知,我应该只使用花车和整体。我知道它打印“除以4”部分,因为在功能中我将其切换为5并打印“5.0000”。如果我将“结果”设为int,它显然会删除小数点的答案,但它仍然给出正确的平均值而不是“4”。 为什么在结果变量中存储“4.0000”而不是答案?

void main(void)
{
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;
// stop watchdog timer\

srand(time(NULL));
int val1 = (rand()%100);
int val2 = (rand()%100);
int val3 = (rand()%100);
int val4 = (rand()%100);
printf("%d\n",val1);
printf("%d\n",val2);
printf("%d\n",val3);
printf("%d\n",val4);

printf("%f\n",average4(val1, val2, val3, val4));
}


float average4(int val1, int val2, int val3, int val4){
float result;
result = (val1 + val2 + val3 + val4)/4;
return result;
}

2 个答案:

答案 0 :(得分:1)

两个问题:

  1. (val1 + val2 + val3 + val4)/4;整数算术中计算,因为这些术语是整数类型。剩下的就丢弃了。

    一种解决方法是撰写1.f * (val1 + val2 + val3 + val4) / 4;或稍微混淆0.25f * (val1 + val2 + val3 + val4);

  2. 您错过了average4的原型。正式地,执行该操作的行为是 undefined (因为包括C99),您可能正在观察在调用站点转换为int

答案 1 :(得分:1)

以下提议的代码:

    由于三个字段:WDT_A WDT_A_CTL_HOLDWDT_A_CTL_PW未被声明,因此
  1. 编译不完整。
  2. 现在提出的代码,带有评论

    #include <stdio.h>     // printf()
    #include <stdlib.h>    // rand(), srand()
    #include <time.h>      // time()
    
    // prototypes
    float average4(int val1, int val2, int val3, int val4);
    
    
    int main(void)                       // corrected signature
    {
        WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;
        // stop watchdog timer           // removed trailing line continuation 'slash'
    
        srand( (unsigned int)time(NULL)); // cast to expected type
        int val1 = (rand()%100);
        int val2 = (rand()%100);
        int val3 = (rand()%100);
        int val4 = (rand()%100);
        printf("%d\n",val1);
        printf("%d\n",val2);
        printf("%d\n",val3);
        printf("%d\n",val4);
    
        printf("%f\n",average4(val1, val2, val3, val4));
    }
    
    
    float average4(int val1, int val2, int val3, int val4)
    {
        float result;
        // cast the 'integer' sum to 'float',
        // properly declared the '4' as a 'float' literal
        // so division is 'float' rather than `'integer' division
        result = (float)(val1 + val2 + val3 + val4)/4.0f;
        return result;
    }
    

    进行测试时,我注释掉试图弄乱看门狗定时器的那一行。

    我使用gcc运行上面的代码来编译/链接然后在我的ubuntu linux系统上打开一个终端,这里有几个典型的执行。

    32
    13
    74
    29
    37.000000
    

    77
    53
    90
    49
    67.250000