【问题标题】:Average of 4 variables function printing "4.00000" (divided by 4) rather than the actual average4 个变量函数的平均值打印“4.00000”(除以 4)而不是实际平均值
【发布时间】:2018-01-24 16:11:36
【问题描述】:

我想知道我是否使用了正确的变量类型。据我所知,我应该只使用浮点数和整数。我知道它打印“除以 4”部分,因为在函数中我将其切换为除以 5 并打印“5.0000”。如果我将“结果”设为整数,它显然会去掉小数点的答案,但它仍然给我正确的平均值而不是“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;
}

【问题讨论】:

  • 哦,您知道这可能是什么解决方案。我现在做不到,但我没有那个原型。
  • 编译器警告,启用它们,查看它们。
  • 函数 main() 的签名始终具有返回类型 int,(无论 Visual Studio 允许什么)
  • 贴出的代码无法编译!除其他外,不包括必要的头文件。

标签: c function floating-point average


【解决方案1】:

两个问题:

  1. (val1 + val2 + val3 + val4)/4;整数运算 计算,因为这些项是整数类型。剩余部分被丢弃。

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

  2. 您缺少average4 的原型。正式地,这样做的行为是未定义(自 C99 起并包括 C99),您可能会在调用站点观察到到 int 的转换。

【讨论】:

  • 我认为1f 会是一个语法错误。至少在我使用f 后缀的某些编译器上仍然需要小数点。
  • @EugeneSh:我想知道 C 标准是怎么说的:让我们等待一些反对意见。
  • @EugeneSh.:如果这个答案不正确,那将是值得的。稍后我会检查确定。
  • 那么为什么它给我答案“4.0000”而不是去掉它的十进制值的答案?
  • 我认为不那么模糊的(val1 + val2 + val3 + val4) / 4.0f 也可以。
【解决方案2】:

以下建议的代码:

  1. 没有完全编译,因为三个字段:WDT_A WDT_A_CTL_HOLDWDT_A_CTL_PW 没有声明。

现在是建议的代码,带有注释

#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

【讨论】:

  • 我的编译器一定有问题,因为我运行了它,它给了我 0.0000000 作为平均值。
  • @BartoszKaraban,我添加了建议代码的几次执行的输出。他们都正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多