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;//判断输入参数是否非法
};


《完》