不同公式的收益不同,但价值相同

时间:2018-11-24 17:52:51

标签: c++

Tl; dr:为什么C ++看到 x / y * y x /(y * y)之间的区别?

我在CodeWars做一些任务,不得不计算变量并分配结果(底部是整个练习):

  

bmi =体重/身高^ 2

     

如果bmi <= 30.0返回“超重”

     

测试值:体重= 86.7,身高= 1.7

我使用的公式是 double bmi = weight / (height*height) 以后的if语句为 else if (bmi > 25 && bmi <= 30) return "Overweight"; else return "Obese";

,用公式计算出的测试值等于 30 。但是,当我运行代码时,我的回报是 Obese 。我写了一行以打印出计算结果,它显示为 30 。但是,当我将公式更改为double bmi = weight / height / height时,将返回正确的值。因此,问题出在公式中,但是C ++为什么会显示 x / y / y x /(y * y)的区别,即使它可以打印出来结果相同吗?

锻炼:

  

写出计算体重指数的函数bmi(bmi =体重/身高^ 2)。

     

如果bmi <= 18.5,则返回“体重不足”

     

如果bmi <= 25.0返回“正常”

     

如果bmi <= 30.0返回“超重”

     

如果bmi> 30,则返回“肥胖

我的代码:

#include <iostream>
#include <string>

// I created two functions to use two formulas for BMI
std::string bmi(double, double);
std::string bmi2(double, double);   

int main()
{
  std::cout << bmi(86.7, 1.7) << std::endl << std::endl;  // Calling the function
  std::cout << bmi2(86.7, 1.7); 
}

std::string bmi(double w, double h) 
{
  double bmi = w/(h*h); // Formula for BMI  
  std::cout <<"Calculated with w/(h*h): "<< bmi << std::endl;

  if (bmi <= 18.5)
    return "Underweight";
  else if(bmi>18.5 && bmi <= 25.0)
    return "Normal";
  else if (bmi>25 && bmi <= 30)
    return "Overweight";    // It should return this
  else 
    return "Obese";         // But goes with that
}

std::string bmi2(double w, double h) 
{
  double bmi = w/h/h;   // Formula for BMI
  std::cout <<"Calculated with w/h/h: "<< bmi << std::endl;

  if (bmi <= 18.5)
    return "Underweight";
  else if(bmi>18.5 && bmi <= 25.0)
    return "Normal";
  else if (bmi > 25 && bmi <= 30)
    return "Overweight";
  else
    return "Obese";
}

1 个答案:

答案 0 :(得分:2)

因为算术运算符从左到右进行求值,并且通过在y * y周围插入括号来更改执行顺序。顺序很重要,因为存在浮点错误,您可以在网上找到任意数量的文章。简而言之,整数可以精确地表示为一定数目,但是小数几乎总是不准确的,这就是为什么永远不要测试浮点数和双精度数是否完全相等的原因。