很抱歉,如果之前有人询问,但我不确定如何制定我的搜索以获得任何相关结果。
基本上我有一个类“Wheel”,在那个类中我声明了==运算符应该如何工作:
bool operator == (Wheel& anotherWheel){
//Circumference of a wheel, times its RPM should give its speed
//The speed will be in what ever unit the radius is, per minute
double ourSpeed = 2 * PI * radius * rpm;
double anotherSpeed = 2 * PI * anotherWheel.getRadius() * anotherWheel.getRpm();
cout << ourSpeed << " vs " << anotherSpeed << endl;
if (ourSpeed == anotherSpeed){
return true;
}
return false;
除了切换之外,当车轮的半径和RPM与其他车轮的半径和RPM相同时,这是有效的。所以换句话说,它并不适用于:
2 * PI * 3 * 10 vs 2 * PI * 10 * 3
即使我将它打印出来并且它们在控制台中完全相同(除非我的基本数学知识完全失控,否则应该是这样)。
我设法通过在计算速度时添加一个paranthesis来解决它:
double ourSpeed = 2 * PI * (radius * rpm);
double anotherSpeed = 2 * PI * (anotherWheel.getRadius() * anotherWheel.getRpm());
但是我想明白为什么会发生这种情况,PI只是我声明的一个常数,所以无所谓。
谢谢!
答案 0 :(得分:1)
小心浮点数。
根据添加的顺序,添加一组浮点数可能会有所不同。乘法和各种其他操作也是如此。
这是因为精度限制导致的舍入。
e.g。 1/3 + 1/3 = 2/3
然而
0.33333334 + 0.33333334 = 0.6666668 不是0.6666667,这理想情况下是2/3。
您需要使用容差级别,以确定该值是否足够接近&#39;被认为是平等的。
一个非常基本的(天真的和不灵活的)选项可能是:
if(fabs(a - b) < 0.001)
但还有更好的方法。
如果您真的想了解浮点数,请从这里开始:Oracle Floating Point - 它会告诉您需要知道的一切,以及更多。