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