C++ 多精度:用10的幂乘或除最便宜的方法是什么?比如10次方的比特移位运算?

C++ 多精度:用10的幂乘或除最便宜的方法是什么?比如10次方的比特移位运算?,c++,c++11,math,boost,boost-multiprecision,C++,C++11,Math,Boost,Boost Multiprecision,考虑以下MCVE: #include <iostream> #include <boost/multiprecision/cpp_int.hpp> int main() { boost::multiprecision::cpp_int x = 10; x *= 10000000000000000000000000000000000000000000000000000000000000; std::cout<<x<<std:

考虑以下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%安全


查找示例。

您需要一个函数来自动生成所需的数字

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有一个baked-in-pow函数,我找不到,就用它来代替。

如果你投反对票,请说出原因并解释如何改进这个问题。也许可以使用模板化的UDL来创建整数。@Justin你能提供一个链接/参考吗?它是一个数值文本运算符模板,或者您可能希望尝试编写自己的用户定义文本。关于这个主题。不幸的是,标准中没有整数的pow,这将导致精度问题。除此之外,使用字符串比这些乘法要便宜得多。不管怎样,谢谢你的帮助。如果我没有错的话,10^61计算我们得到9次乘法。没有那么多。。。