数值的整数次方
不能用等号判断不精确数字是不是相等;
在软件开发过程中,永远不变的就是需求会一直改变。
实现函数 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:clean
CPP=g++
CFLAGS=-Wall -g
BIN=test
OBJS=Power.o
LIBS=
$(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.