boost::multiprecision: Какой самый дешевый способ умножения или деления на огромную степень 10? Что-то наподобие bitsift op для степеней 10?
Рассмотрим следующий MCVE:
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
int main()
{
boost::multiprecision::cpp_int x = 10;
x *= 10000000000000000000000000000000000000000000000000000000000000;
std::cout<<x<<std::endl;
return 0;
}
Это дает неправильный результат, из-за очевидного переполнения int
, Как я могу сделать это правильно, если я не хочу использовать строки? Есть ли что-то вроде "оператора сдвига цифр" или функции мощности, которая может сделать это дешево (или дешевле)?
Зачем? Поскольку у меня есть библиотека с фиксированной точностью, которую я написал, и масштабирование внутреннего целого требует, чтобы такие операции были на 100% безопасными.
Найдите пример здесь.
1 ответ
Вам понадобится функция автоматического генерирования нужного вам числа.
boost::multiprecision::cpp_int pow(boost::multiprecision::cpp_int value, boost::multiprecision::cpp_int exponent) {
if(exponent <= 0)
return 1;
else if(exponent == 1)
return value;
else {
if(exponent % 2 == 0) {
return pow(value * value, exponent / 2);
} else {
return value * pow(value, exponent - 1);
}
}
}
int main()
{
boost::multiprecision::cpp_int x = 10;
x *= pow(10, 61);//I believe this is the correct number of 0's from manually counting
std::cout<<x<<std::endl;
return 0;
}
Если boost.multiprecision выпекается в pow
функция (я не мог найти один), используйте его вместо этого.