Code Bye

求帮助精通模板的

inline double _SQRT_ (double value) {
	const double half = value * double (0.5) ;
	union {
		static_assert (sizeof (double) == sizeof (__int64) ,"") ;
		double a ;
		__int64 b ;
	} tmp ;
	tmp.a = value ;
	tmp.b = __int64 (0X5FE6EC85E7DE30DA) - (tmp.b >> 1) ;
	value = tmp.a ;
	value *= double (1.5) - value * value * half ;
	value *= double (1.5) - value * value * half ;
	value *= double (1.5) - value * value * half ;
	value = 1 / value ;
	return value ;
}

本人想要一个constexpr型的_SQRT_用于模板当中,例如
在一个参数为SIZE的模板类中本人需要_SQRT_ (SIZE)的额外缓冲区
应该怎么写?

解决方案

50

#include <limits>   
namespace detail {
    constexpr double sqrt_newton_raphson(double x, double curr, double prev) {
        return curr == prev
            ? curr
            : sqrt_newton_raphson(x, 0.5 * (curr + x / curr), curr);
    }
}
constexpr double cesqrt(double x) {
    return x >= 0 && x < std::numeric_limits<double>::infinity()
        ? detail::sqrt_newton_raphson(x, x, 0)
        : std::numeric_limits<double>::quiet_NaN();
}
constexpr size_t ceround(double x) {
    return size_t(x + 0.5);
}
template<typename T>
auto get_buffer() {
    constexpr auto st = cesqrt(static_cast<double>(sizeof(T)));
    constexpr auto len = ceround(st);
    static char buf[len];
    return buf;
}

http://stackoverflow.com/questions/8622256/in-c11-is-sqrt-defined-as-constexpr


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮助精通模板的