如何从 boost int256_t 中获取以 2 为底的对数?
How to take a base 2 logarithm from a boost int256_t?
所以我想从 int256_t 中取对数。
我找到了这个,但是修改它以使用 sizeof int256_t 没有用。它会给出不正确的结果:
boost中有支持多精度的log函数吗?
如果没有进一步的限制,我会写:
int256_t x("12345678901234567890");
std::cout << "log2(" << x << ") = " << log2(cpp_bin_float_100(x)) << "\n";
版画
log2(12345678901234567890) = 63.4206
更简单
如果无论如何都要对结果进行四舍五入,则不需要那么精确:
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 建议的方式应用位操作技巧
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)
生成一个 32 位值的 log2 和 returns 一个 double
.
根据字节顺序,反转 bytes_array
和修改算法可能会使其更快(理想情况下它应该编译成 memcpy 或完全优化掉)。
这会尝试将 4 个最高有效字节放入 int32_t,取其对数,然后加上正确的量以将其移动到所讨论的 N 字节整数的大小。
所以我想从 int256_t 中取对数。
我找到了这个,但是修改它以使用 sizeof int256_t 没有用。它会给出不正确的结果:
boost中有支持多精度的log函数吗?
如果没有进一步的限制,我会写:
int256_t x("12345678901234567890");
std::cout << "log2(" << x << ") = " << log2(cpp_bin_float_100(x)) << "\n";
版画
log2(12345678901234567890) = 63.4206
更简单
如果无论如何都要对结果进行四舍五入,则不需要那么精确:
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 建议的方式应用位操作技巧
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)
生成一个 32 位值的 log2 和 returns 一个 double
.
根据字节顺序,反转 bytes_array
和修改算法可能会使其更快(理想情况下它应该编译成 memcpy 或完全优化掉)。
这会尝试将 4 个最高有效字节放入 int32_t,取其对数,然后加上正确的量以将其移动到所讨论的 N 字节整数的大小。