boost :: multiprecision: Какой самый дешевый способ умножения или деления на огромную степень 10? Что-то наподобие bitsift op для степеней 10? - PullRequest
0 голосов
/ 05 января 2019

Рассмотрим следующие 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 Ответ

0 голосов
/ 05 января 2019

Вам понадобится функция автоматического генерирования нужного вам числа.

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 (я не смог ее найти), используйте ее вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...