在sqrt模板功能方面遇到了一些问题(只是想尝试,我知道< cmath>赢得了瓶颈任何东西)
下面的代码给出了错误:模板参数太多
namespace {
static const size_t ITERATIONS = 10;
}
template <typename T, T N> struct Sqrt {
static const T value = Sqrt<T, N, 1, ITERATIONS>::value;
};
//Newtons method: A = (N / A + A) / 2
template <typename T, T N, T A, size_t I> struct Sqrt {
static const T value = Sqrt<T, N, (N / A + A) / 2, I - 1>::value;
};
template <typename T, T N, T A> struct Sqrt<T, N, A, 0> {
static const T value = A;
};
由于
答案 0 :(得分:1)
代码可以比你想象的简单得多。
#include <iostream>
template<int N, int M> struct Sqrt
{
static const int value = (Sqrt<N, M-1>::value + N/Sqrt<N, M-1>::value)/2;
};
template<int N> struct Sqrt<N, 0>
{
static const int value = N/2;
};
int main()
{
int y = Sqrt<200, 10>::value;
std::cout << "Sqrt(200): " << y << std::endl;
y = Sqrt<200, 20>::value;
std::cout << "Sqrt(200): " << y << std::endl;
y = Sqrt<2000, 10>::value;
std::cout << "Sqrt(2000): " << y << std::endl;
y = Sqrt<2000, 20>::value;
std::cout << "Sqrt(2000): " << y << std::endl;
}
下面列出的结果是近似值,因为我们只处理整数值。
Sqrt(200): 14 Sqrt(200): 14 Sqrt(2000): 44 Sqrt(2000): 44
然而,当我试图计算一个完美正方形的数字的平方根时,我得到了完美的答案。
y = Sqrt<10000, 10>::value;
std::cout << "Sqrt(10000): " << y << std::endl;
y = Sqrt<10000, 20>::value;
std::cout << "Sqrt(10000): " << y << std::endl;
Sqrt(10000): 100 Sqrt(10000): 100