Twój kod nie został skompilowany, powinieneś, jeśli to możliwe, najpierw sprawdzić kompilację kodu, użyć kompilatora lub najpierw sprawdzić go na kompilatorze.
Ponadto zapomniałeś wziąć pod uwagę wartości ujemne. To bardzo ważna cecha mocy integralnych. Poniższy kod dotyczy zwykłego typu int. Pozwolę ci zbadać, jak możesz rozszerzyć go na inne integralne typy.
#include <type_traits>
#include <iostream>
#include <cmath>
#include <limits>
using namespace std;
template <typename T>
enable_if_t< is_integral<T>::value, T>
mypow(T base, unsigned int exp)
{
T result = T(1);
bool sign = (base < 0);
if (sign) base = -base;
T temp = result;
while(exp-- != 0)
{
temp *= base;
if (temp < result)
{
return (sign) ? numeric_limits<T>::min()
: numeric_limits<T>::max();
}
result = temp;
}
return (sign && (exp & 1)) ? -result : result;
}
template <typename T>
enable_if_t< !is_integral<T>::value, int>
mypow(const T& base, unsigned int exp)
{
T result = T(1);
int i_base = int(floor(base + .5));
bool sign = (i_base < 0);
if (sign) i_base = -i_base;
int temp = result;
while(exp-- != 0)
{
temp *= i_base;
if (temp < result)
{
return (sign) ? numeric_limits<int>::min() : numeric_limits<int>::max();
}
result = temp;
}
return (sign && (exp & 1)) ? -result : result;
}
W prawdziwym życiu, zrobiłbym tę notatkę użycie podłogi, nawet w integralnym przypadku.
template<typename T>
enable_if_t< is_integral<T>::value, T>
mypow(T x, unsigned int y) { return T(floor(pow(x, y) + .5)); }
template<typename T>
enable_if_t< !is_integral<T>::value, int>
mypow(T x, unsigned int y) { return int(floor(pow(floor(x + .5), y) + .5)); }
Nie możesz użyć ['std :: pow'] (http://en.cppreference.com/w/cpp/numeric/math/pow) i skrócić wynik, jeśli jest to konieczne? – NathanOliver
@NathanOliver Tak ... jeśli był sposób na zagwarantowanie ** 1 ** i ** 2 ** nie zostałby naruszony przez to. Czy istnieje sposób, aby to osiągnąć? –
Można użyć rekursji ogonowej i niektórych sztuczek numerycznych w celu poprawy wydajności środowiska wykonawczego. Co więcej, możesz uczynić tę metodę constexpr. https://stackoverflow.com/questions/9348933/using-recursion-to-raise-a-base-to-its-exponent-c – Andrew