下面是使用二進制搜索一個constexpr平方根實現。它正常達到2^64 gcc和鐺,其它更簡單的版本常常失敗數> 2^32因爲編譯器限制遞歸深度到例如200.
// C++11 compile time square root using binary search
#define MID ((lo + hi + 1)/2)
constexpr uint64_t sqrt_helper(uint64_t x, uint64_t lo, uint64_t hi)
{
return lo == hi ? lo : ((x/MID < MID)
? sqrt_helper(x, lo, MID - 1) : sqrt_helper(x, MID, hi));
}
constexpr uint64_t ct_sqrt(uint64_t x)
{
return sqrt_helper(x, 0, x/2 + 1);
}
下面是一個更好的版本(爲整數常數),它要求C++ 14,它類似於在巴普蒂斯特Wicht的blog post呈現的一個。 C++ 14個constexpr函數被允許使用局部變量和if語句。
// C++14 compile time square root using binary search
template <typename T>
constexpr T sqrt_helper(T x, T lo, T hi)
{
if (lo == hi)
return lo;
const T mid = (lo + hi + 1)/2;
if (x/mid < mid)
return sqrt_helper<T>(x, lo, mid - 1);
else
return sqrt_helper(x, mid, hi);
}
template <typename T>
constexpr T ct_sqrt(T x)
{
return sqrt_helper<T>(x, 0, x/2 + 1);
}
這是否明確規定? 26。8 C庫沒有提及constexpr。如果一個實現提供了constexpr函數實現以及那些沒有實現的實現,它肯定仍然是一致的。 – user2023370 2012-05-16 22:44:26
@ user643722:標準庫實現*可以*定義一個'constexpr'版本。但它不是必需的,因此你不能真正依靠它。 – 2012-05-16 23:35:55