Double precision in C++ (or pow(2, 1000))

前端 未结 7 515
情书的邮戳
情书的邮戳 2021-01-14 19:38

I\'m working on Project Euler to brush up on my C++ coding skills in preparation for the programming challenge(s) we\'ll be having this next semester (since they don\'t let

相关标签:
7条回答
  • 2021-01-14 19:58

    You need a bignum library, such as this one.

    0 讨论(0)
  • 2021-01-14 20:00

    If you want to do this sort of thing on a practical basis, you're looking for an arbitrary precision arithmetic package. There are a number around, including NTL, lip, GMP, and MIRACL.

    If you're just after something for Project Euler, you can write your own code for raising to a power. The basic idea is to store your large number in quite a few small pieces, and implement your own carries, borrows, etc., between the pieces.

    0 讨论(0)
  • 2021-01-14 20:01

    UPDATE: I just browsed to the Euler Problem site and found that Problem 13 is about summing large integers. The iterated method can become very tricky after a short while, so I'd suggest to use the code from Problem #13 you should have already to solve this, because 2**N => 2**(N-1) + 2**(N-1)

    Using bignums is cheating and not a solution. Also, you don't need to compute 2**1000 or anything like that to get to the result. I'll give you a hint:

    Take the first few values of 2**N:

    0 1 2 4 8 16 32 64 128 256 ...
    

    Now write down for each number the sum of its digits:

    1 2 4 8 7 5 10 11 13 ...
    

    You should notice that (x~=y means x and y have the same sum of digits)

    1+1=2, 1+(1+2)=4, 1+(1+2+4)=8, 1+(1+2+4+8)=16~=7 1+(1+2+4+8+7)=23~=5
    

    Now write a loop.

    Project Euler = Think before Compute!

    0 讨论(0)
  • 2021-01-14 20:06

    C/C++ operates on fundamental data types. You are using a double which has only 64 bits to store a 1000 bit number. double uses 51 bit for the significant digits and 11 bit for the magnitude.

    The only solution for you is to either use a library like bignum mentioned elsewhere or to roll out your own.

    0 讨论(0)
  • 2021-01-14 20:12

    You probably need a pointer here (pun intended)

    In C++ you would need to create your own bigint lib in order to do the same as in python.

    0 讨论(0)
  • 2021-01-14 20:12

    Isn't pow(2, 1000) just 2 left-shifted 1000 times, essentially? It should have an exact binary representation in a double float. It shouldn't require a bignum library.

    0 讨论(0)
提交回复
热议问题