劍指offer——實現Power()


double和float類型小數在計算機中的存儲都不精確,所以如果兩個數的誤差很小時則認爲它們相等


class PowerTest{
public:
    double Power(double base, int exp)
    {
        IsInvalied = false;
        //如果底數爲0且指數小於0,則會導致1除以0,輸入非法
        if (Equal(base, 0.0) && exp < 0){ IsInvalied = true; return 0;}
        else if (Equal(base, 0.0))return 0.0;

        //true表示exp爲正,false表示exp爲負
        bool symbol = true;
        if (exp < 0){ symbol = false; exp *= (-1); }
         //double ret = PowerExp(base,exp);
         double ret = PowerExp2(base,exp);
        
        if (symbol == false){ ret = 1.0 / ret; }
        return ret;
    }
private:
     double PowerExp(double base,int exp)
     {
         double ret=1.0;
         while (exp>0){
            ret *= base;
            --exp;
         }
         return ret;
     }
    double PowerExp2(double base, int exp)
        {
                        if  (exp  ==  0){  return  1.0;  }
                if (exp == 1){ return base; }
                double ret = PowerExp2(base, exp >> 1);
                ret *= ret;
                if (exp & 0x1 == 1){
                    ret *= base;
                }
                return ret;
        } 
     //浮點數大小的比較
    bool Equal(double num1, double num2)
    {
        if (num1 - num2 > -0.0000001&&num1 - num2 < 0.0000001)
            return true;
        else 
            return false;
    }
private:
    bool IsInvalied;//判斷輸入參數是否非法
};


《完》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章