【面试题十一】数值的整数次方

来源:互联网 发布:免费淘宝店标在线制作 编辑:程序博客网 时间:2024/05/20 09:27

数值的整数次方


不能用等号判断不精确数字是不是相等;

在软件开发过程中,永远不变的就是需求会一直改变。


实现函数 double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时步需要考虑大数问题。

这个指数可能是0,正数,或者负数,


判断两个小数是否相等,不能判断他们之差的绝对值是不是在一个很小的范围内,如果两个数相差很小, 就可以认为他们相等;


Power.cpp:

#include <iostream>#include <cmath>#include <cstdio>using namespace std;bool g_InvalidInput = false;bool equal(double num1, double num2);double PowerWithUnsignedExponent(double base, unsigned int exponent);double Power(double base, int exponent){g_InvalidInput = false;if(equal(base, 0.0) && exponent < 0){g_InvalidInput = true;return 0.0;}unsigned int absExponent = (unsigned int)(exponent);if(exponent < 0){absExponent = (unsigned int)(-exponent);}double result = PowerWithUnsignedExponent(base, absExponent);if(exponent < 0){result = 1.0 / result;}return result;}/*double PowerWithUnsignedExponent(double base, unsigned int exponent){    double result = 1.0;    /    for(int i = 1; i <= exponent; ++i)        result *= base;     return result;}*/double PowerWithUnsignedExponent(double base,unsigned int exponent){if(exponent == 0){return 1;}if(exponent == 1){return base;}/*除2运算用右移运算来实现效率更高*/double result = PowerWithUnsignedExponent(base,exponent >> 1);result *= result;/*判断是奇数还是偶数*/if((exponent & 0x1) == 1){result *=base;}return result;}bool equal(double num1, double num2){if((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)){return true;}else{return false;}}// ====================测试代码====================void Test(double base, int exponent, double expectedResult, bool expectedFlag){    double result = Power(base, exponent);    if(abs(result - expectedResult) < 0.00000001         && g_InvalidInput == expectedFlag)        printf("Test passed.\n");    else        printf("Test failed.\n");}int main(){// 底数、指数都为正数    printf("Test1 begins.\n");    Test(2, 3, 8, false);    // 底数为负数、指数为正数    printf("Test2 begins.\n");    Test(-2, 3, -8, false);    // 指数为负数    printf("Test3 begins.\n");    Test(2, -3, 0.125, false);    // 指数为0    printf("Test4 begins.\n");    Test(2, 0, 1, false);    // 底数、指数都为0    printf("Test5 begins.\n");    Test(0, 0, 1, false);    // 底数为0、指数为正数    printf("Test6 begins.\n");    Test(0, 4, 0, false);    // 底数为0、指数为负数    printf("Test7 begins.\n");    Test(0, -4, 0, true);return 0;}


Makefile

.PHONY:cleanCPP=g++CFLAGS=-Wall -gBIN=testOBJS=Power.oLIBS=$(BIN):$(OBJS)$(CPP) $(CFLAGS) $^ -o $@ $(LIBS)%.o:%.cpp$(CPP) $(CFLAGS) -c $< -o $@clean:rm -f *.o $(BIN)


运算结果:

Test1 begins.Test passed.Test2 begins.Test passed.Test3 begins.Test passed.Test4 begins.Test passed.Test5 begins.Test passed.Test6 begins.Test passed.Test7 begins.Test passed.


原创粉丝点击