计算变量并进行比较

时间:2018-02-01 11:09:32

标签: c++ math

很抱歉,如果之前有人询问,但我不确定如何制定我的搜索以获得任何相关结果。

基本上我有一个类“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只是我声明的一个常数,所以无所谓。

谢谢!

1 个答案:

答案 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 - 它会告诉您需要知道的一切,以及更多。