数值的整数次方 & 3种错误处理的方法

    xiaoxiao2023-09-26  168

    问题描述:

            实现Power(double base,int exponent),求base的exponent次方,不考虑大数问题。

    分析:

             指数小于0时,得到正数部分,最后结果要取倒数;而指数为0且底数为0时就错误,因为0不能取倒数

    代码实现:

    bool g_InvalidInput = false; bool is_0(double base) { return base >= (-1e-6) && base <= (1e-6); //1e-6即10的-6次方 } double PowerWithUnsignedExponent(double base, int exponent) { /* 实现一,还能更高效 double result = 1.0; for (int i = 0; i < exponent; i++) result *= base; return result;*/ //实现2 if (exponent == 0) //指数为0 return 1.0; if (exponent == 1) //指数为1 return base; double result = PowerWithUnsignedExponent(base, exponent >> 1); //求16次方 == 8次方*8次方 result *= result; if (exponent & 0x1 == 1) //为奇数的话,则还要在乘一次 result *= base; return result; } double Power(double base, int exponent) { g_InvalidInput = false; //防止其他代码之前修改过,需要置为false if (is_0(base) && exponent < 0) //底数为0,指数为负,取反时会出问题 { g_InvalidInput = true; return 0.0; } if (exponent == 0 && is_0(base)) //指数底数都是0 return 0.0; unsigned int absExponent = (unsigned int)(exponent); if (exponent < 0) //指数小于0,得到其有效数值 absExponent = (unsigned int)(-exponent); double result = PowerWithUnsignedExponent(base, exponent); if (exponent < 0) //指数小于0,取倒 result = 1.0 / result; return result; }

     

     

     

    3种错误处理的方法:

    方法一:返回值告诉调用方

    方法二:设置全局变量

    方法三:抛出异常

    3种方式的比较:

            

    最新回复(0)