程序返回inf?

时间:2014-08-30 00:24:27

标签: c floating-point

我认为错误在于这一行:

float bmi = weight * 703 / pow(height, 2.0); // user inputs weight and height and the bmi should be calculated.

问题是,我创建了一个模拟程序,其中已经输入了值,一切都很好。但是当我使用scanf()让用户输入相同的值时,它不起作用。

#include <stdio.h>
#include <math.h>

int main ()
{
    float weight = 105, height = 63;
    float bmi;
    bmi = weight * 703 / pow(height, 2.0);
    printf("%f\n", bmi);
}

重量和高度都是浮子。当我尝试打印bmi时,我得到&#34; inf。&#34;

**编辑显示输入功能和打印声明。

 printf("Weight? ");
    scanf("%f", &weight);

printf("BMI is %.2f.\n", bmi);

另一个输入语句与替换权重的单词高度基本相同。

编辑:这是整个代码

#include <stdio.h>
#include <math.h>

int main ()
{
    float weight, height;
    float bmi = weight * 703 / pow(height, 2.0);

    printf("Height? ");
    scanf("%f", &height);

    printf("Weight? ");
    scanf("%f", &weight);

    printf("Your BMI is calculated at %.2f.\n", bmi);

    printf("%f\n", height);
    printf("%f\n", weight);


}

3 个答案:

答案 0 :(得分:3)

您正在使用weightheight未初始化:

   float weight, height;
   float bmi = weight * 703 / pow(height, 2.0);

这是未定义的行为,这就是为什么你得到inf,在我的情况下,我得到0.00,但任何事情都可以在UB下发生。

更改为

#include <stdio.h>
#include <math.h>

int main(void)
{
    float weight, height;
    float bmi;

    printf("Height? ");
    scanf("%f", &height);

    printf("Weight? ");
    scanf("%f", &weight);

    bmi = weight * 703 / pow(height, 2.0);
    printf("Your BMI is calculated at %.2f.\n", bmi);

    printf("%f\n", height);
    printf("%f\n", weight);
    return 0;
}

答案 1 :(得分:1)

您需要在使用之前初始化变量。

int main ()
{
    float weight, height;
    float bmi;

    printf("Height? ");
    scanf("%f", &height);

    printf("Weight? ");
    scanf("%f", &weight);

    bmi = weight * 703 / pow(height, 2.0);

    printf("Your BMI is calculated at %.2f.\n", bmi);

    printf("%f\n", height);
    printf("%f\n", weight);

}

答案 2 :(得分:0)

float weight, height;
float bmi = weight * 703 / pow(height, 2.0);

我认为您认为这定义了bmi的含义,bmiweight更改时height的值会发生变化。< / p>

我记得第一次开始编程时发生了类似的错误。与数学方程不同,C中的语句按顺序执行。您很快就会了解影响该订单的方法,但是对于像这样的小型程序,这些语句是线性执行的。

初始化就像一个赋值。这样:

float bmi = weight * 703 / pow(height, 2.0);

做同样的事情:

float bmi;
bmi = weight * 703 / pow(height, 2.0);

它将bmi的值设置为表达式在评估时的结果。由于您还没有为weightheight分配值,因此它们的值是垃圾,而分配给bmi的表达式结果也是垃圾。您稍后打印未更改的垃圾值。

如果您希望bmi成为您引用时评估的内容而不是定义时,可以使其成为一种功能 - 但是&#39在这种情况下没有必要。相反,只需确保您分配给bmi的值有效,这意味着必须在之后计算,您已将值分配给width和{{ 1}}。

height和height`中存储有效值之后,将初始化放在bmi的声明上并添加等效的作业

width

正如其他人建议的那样,您也可以在程序中稍后移动声明和初始化。 (早期版本的C有限制使得这很困难,有些编​​译器可能仍然不支持它。)