考虑以下课程
template <typename T>
struct A
{
T x;
};
Run Code Online (Sandbox Code Playgroud)
现在,另一个类是这样的模板:
template <typename T, typename U>
class B
{
protected:
std::vector<U> arr;
public:
T get_x(unsigned int p) { return arr[p].x; }
};
Run Code Online (Sandbox Code Playgroud)
我想A<T>::x从内部访问该字段B<T, A<T>>::get_x()并将其保持不变(即保持其类型T).我对模板的不了解说,这需要知道T它的类型和它应该是模板参数之一class B.然而,这使得可以声明不一致的东西,例如B<int, A<double>>,并且通常听起来像是不必要的重复.
T的A<T>::x,避免两个模板类型?感觉就像是重复,所以我不确定是否有一个敬畏上帝,标准持久的解决方案.对于它的价值,我使用GCC 4.6.2和-std = c ++ 0x.
我有一个解码方程的数字代码,f(x) = 0我必须提高x功率p.我用一堆东西解决它,但最后我有牛顿的方法.解决方案恰好相同x = 1,因此是我的问题的原因.当迭代解决方案接近时1,比如x = 1 + 1e-13,计算所需的时间std::pow(x, p)大大增加,很容易达到100倍,使我的代码无法使用.
运行这个东西的机器是CentOS上的AMD64(Opteron 6172),命令很简单y = std::pow(x, p);.类似的行为出现在我的所有机器上,全部是x64.正如这里所记录的,这不仅是我的问题(也就是说,其他人也很生气),只出现在x64上,而且仅用于x接近1.0.类似的事情发生了exp.
解决这个问题对我来说至关重要.有没有人知道是否有任何解决这种缓慢的方法?
编辑:约翰指出,这是由于非正规.问题是,如何解决这个问题?代码是C++,编译后g++使用GNU Octave.看来,虽然我已经设置CXXFLAGS,包括-mtune=native和-ffast-math,这是没有帮助和代码运行一样慢.
现在的解决方案:对于所有关心这个问题的人,下面提出的解决方案对我个人而言并不适用.我真的需要通常的速度std::pow(),但没有周围的迟钝x = 1.我个人的解决方案是使用以下hack:
inline double mpow(double x, double p) __attribute__ ((const));
inline double mpow(double x, double p)
{
double y(x - 1.0);
return (std::abs(y) …Run Code Online (Sandbox Code Playgroud)