Few clever algorithms for fast power x^N
This commit is contained in:
parent
604b19ce74
commit
530c6f4fcd
20
sample/testAlgo.cpp
Normal file
20
sample/testAlgo.cpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "algo.hpp"
|
||||||
|
|
||||||
|
using namespace CosmoTool;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
cout << square(2) << endl;
|
||||||
|
cout << cube(2) << endl;
|
||||||
|
cout << square(2.1f) << endl;
|
||||||
|
cout << cube(2.1f) << endl;
|
||||||
|
|
||||||
|
cout << spower<2>(2.1f) << endl;
|
||||||
|
cout << spower<3>(2.1f) << endl;
|
||||||
|
cout << spower<4>(2.1f) << endl;
|
||||||
|
cout << spower<5>(2.1f) << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
59
src/algo.hpp
Normal file
59
src/algo.hpp
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#ifndef __COSMOTOOL_ALGO_HPP
|
||||||
|
#define __COSMOTOOL_ALGO_HPP
|
||||||
|
|
||||||
|
#include "config.hpp"
|
||||||
|
|
||||||
|
namespace CosmoTool
|
||||||
|
{
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T cube(T a)
|
||||||
|
{
|
||||||
|
return a*a*a;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T square(T a)
|
||||||
|
{
|
||||||
|
return a*a;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<int N>
|
||||||
|
class SPowerBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template<typename T>
|
||||||
|
static T spower(T a)
|
||||||
|
{
|
||||||
|
if ((N%2)==0)
|
||||||
|
{
|
||||||
|
T b = SPowerBase<N/2>::spower(a);
|
||||||
|
return b*b;
|
||||||
|
}
|
||||||
|
T b = SPowerBase<(N-1)/2>::spower(a);
|
||||||
|
return a*b*b;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class SPowerBase<0>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template<typename T>
|
||||||
|
static T spower(T a)
|
||||||
|
{
|
||||||
|
return T(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<int N, typename T>
|
||||||
|
T spower(T a)
|
||||||
|
{
|
||||||
|
return SPowerBase<N>::spower(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user