pokemon/sqrt.hpp
Zack Buhman 853457a79d generate: add pokemon
This also includes a handful of functions for creating instances of a
pokemon species, though certainly not complete.
2023-08-02 23:49:42 +00:00

44 lines
1.1 KiB
C++

template <typename T>
inline constexpr T div_ceil(T a, T b)
{
return (a / b) + ((a % b) != 0);
}
static_assert(div_ceil<int>(2, 2) == 1);
static_assert(div_ceil<int>(3, 2) == 2);
static_assert(div_ceil<int>(55, 8) == 7);
static_assert(div_ceil<int>(55, 11) == 5);
template <typename T>
inline constexpr T sqrt_floor(T a)
{
if (a == 0) return 0;
constexpr int num_bits = (sizeof (T)) * 8;
T x = 1 << div_ceil<T>(num_bits, 2);
while (true) {
T y = (x + (a / x)) / 2;
if (y >= x) return x;
x = y;
}
}
static_assert(sqrt_floor<int>(4) == 2);
static_assert(sqrt_floor<int>(9) == 3);
static_assert(sqrt_floor<int>(7056) == 84);
static_assert(sqrt_floor<int>(7211) == 84);
static_assert(sqrt_floor<int>(7225) == 85);
static_assert(sqrt_floor<int>(7226) == 85);
template <typename T>
inline constexpr T sqrt_ceil(T a)
{
T q = sqrt_floor<T>(a);
if (q * q != a) q += 1;
return q;
}
static_assert(sqrt_ceil<int>(7056) == 84);
static_assert(sqrt_ceil<int>(7211) == 85);
static_assert(sqrt_ceil<int>(7225) == 85);
static_assert(sqrt_ceil<int>(7226) == 86);