C++中的双精度(或pow(2,1000))

Way*_*ner 2 c++ precision exponential

我正在使用Project Euler来提高我的C++编码技能,为下一学期我们将要进行的编程挑战做准备(因为他们不让我们使用Python,嘘!).

我在#16,我正试图找到一种方法来保持2°°的真正精确度

例如:

int main(){
    double num = pow(2, 1000);
    printf("%.0f", num):
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

版画

10715086071862673209484250490600018105614050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

缺少大部分数字(来自python):

>>> 2**1000

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376L

当然,我可以用Python 1衬里编写程序

sum(int(_) for _ in str(2**1000))
Run Code Online (Sandbox Code Playgroud)

这给了我立即的结果,但我正试图找到一种方法在C++中做到这一点.有什么指针吗?(哈哈...)

编辑:

标准库之外的东西对我来说毫无价值 - 在这些竞赛中只允许使用死树代码,而且我可能不会打印10,000行外部代码......

Mar*_*som 7

如果您只是跟踪char数组中的每个数字,这很容易.加倍数字是微不足道的,如果结果大于10,你只需减去10并将进位加到下一个数字.从值1开始,在倍增函数上循环1000次,然后就完成了.您可以预测所需的位数ceil(1000*log(2)/log(10)),或者只是动态添加它们.

剧透警报:看来我必须在任何人相信我之前显示代码.这是一个带有两个函数Double和Display的bignum的简单实现.为了简单起见,我没有把它变成一个类.数字以小端格式存储,首先是最低有效数字.




typedef std::vector<char> bignum;

void Double(bignum & num)
{
    int carry = 0;
    for (bignum::iterator p = num.begin();  p != num.end();  ++p)
    {
        *p *= 2;
        *p += carry;
        carry = (*p >= 10);
        *p -= carry * 10;
    }
    if (carry != 0)
        num.push_back(carry);
}

void Display(bignum & num)
{
    for (bignum::reverse_iterator p = num.rbegin();  p != num.rend();  ++p)
        std::cout << static_cast<int>(*p);
}

int main(int argc, char* argv[])
{
    bignum num;
    num.push_back(1);
    for (int i = 0;  i < 1000;  ++i)
        Double(num);
    Display(num);
    std::cout << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)