Как взять логарифм с основанием 2 от наддува int256_t?

Поэтому я хочу взять логарифм из int256_t.

Я нашел это, но изменить его, чтобы взять размер int256_t не работает. Это даст неверные результаты:
https://stackoverflow.com/a/11376759

Есть ли в логе функция лога, которая поддерживает мультиточность?

2

Решение

Без дальнейших ограничений я бы написал:

Жить на Колиру

int256_t x("12345678901234567890");

std::cout << "log2(" << x << ") = " << log2(cpp_bin_float_100(x)) << "\n";

Печать

log2(12345678901234567890) = 63.4206

Simpler

Вам не нужна вся эта точность, если вы все равно хотите округлить результат:

Жить на Колиру

std::cout << "log2(" << x << ") = " << log2(x.convert_to<double>()) << "\n";

Для этого случая

Очень грубая форма может выглядеть так:

Жить на Колиру

template <typename T>
static inline int adhoc_log2(T i) {
int n = 0;
while(i /= 2) ++n;
return n;
}

Печать

adhoc(12345678901234567890) = 63

И наконец, действительно, вы можете вернуться к уровню битов и применить хитроумные хаки так, как подсказывает @SamVarshavchik.

0

Другие решения

template<class T, std::size_t...Is>
std::array<uint8_t, bytes> decomponse( std::index_sequence<Is...>, T in ) {
return {{ (uint8_t)( in >> (8*( (sizeof...(Is)) - Is ) )) }};
}

template<std::size_t bytes, class T>
std::array<int8_t, bytes> decomponse( T in ) {
return decompose( in, std::make_index_sequence<bytes>{} );
}

template<std::size_t bytes, class T>
double big_log2( T in ) {
auto bytes_array = decompose<bytes>(in);
std::size_t zeros = 0;
for (auto byte:bytes_array) {
if (byte) break;
++zeros;
}
int32_t tmp = 0;
for (auto i = zeros; (i < bytes) && i < (zeros+4); ++i) {
tmp |= bytes_array[i] << (8*(3 - (i-zeros)));
}
return log2(tmp) + (bytes-zeros-4)*8;
}

где log2(int32_t) генерирует log2 32-битного значения и возвращает double,

В зависимости от порядка байтов bytes_array и алгоритм модификации может сделать его быстрее (в идеале он должен компилироваться в memcpy или просто полностью оптимизироваться).

Это попытка засунуть 4 старших значащих байта в int32_t, взять его логарифм, а затем добавить правильную величину, чтобы сместить его до величины рассматриваемого N-байтового целого числа.

0