3
votes

I'm trying to use the boost multiprecision library in C++ and I've encountered problems with the gmp_int type. My whole purpose in getting the boost library was to do arithmetic with arbitrarily large integers, so I made the following code just to see if everything worked:

#include <iostream>
#include <boost/multiprecision/gmp.hpp>

using namespace std;
namespace mp=boost::multiprecision;

int main()
{
    mp::gmp_int n;
    cin>>n;         //Here's the
    n=n*2           //problem (at least according to Xcode 5).
    cout<<n<<"\n";
    return 0;
}

But it's throwing "invalid operand" errors in the lines I've marked above. If anyone can find a fix for this and - more importantly - explain what went wrong in the first place it would be much appreciated.

[edit]

sehe's answer seems to have solved the first problem and created a new one. Now I'm getting this:

Undefined symbols for architecture x86_64: "___gmp_get_memory_functions", referenced from: boost::multiprecision::backends::gmp_int::str(long, unsigned int) const in main.o "___gmpz_clear", referenced from: boost::multiprecision::backends::gmp_int::~gmp_int() in main.o "___gmpz_get_str", referenced from: boost::multiprecision::backends::gmp_int::str(long, unsigned int) const in main.o "___gmpz_init", referenced from: boost::multiprecision::backends::gmp_int::operator=(char const*) in main.o boost::multiprecision::backends::gmp_int::gmp_int() in main.o "___gmpz_mul_ui", referenced from: boost::multiprecision::backends::eval_multiply(boost::multiprecision::backends::gmp_int&, boost::multiprecision::backends::gmp_int const&, long) in main.o "___gmpz_neg", referenced from: boost::multiprecision::backends::eval_multiply(boost::multiprecision::backends::gmp_int&, boost::multiprecision::backends::gmp_int const&, long) in main.o "___gmpz_set_str", referenced from: boost::multiprecision::backends::gmp_int::operator=(char const*) in main.o "___gmpz_set_ui", referenced from: boost::multiprecision::backends::gmp_int::operator=(char const*) in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

[/edit]

1
When posting questions about compiler errors, please always include the complete and 'unedited* error output. - Some programmer dude

1 Answers

2
votes

gmp_int is the backend type.

Use number<gmp_int> to adapt it as a general arithmetic type. In this case, mpz_int is already that type:

Live On Coliru

#include <boost/multiprecision/gmp.hpp>
#include <iostream>

namespace mp = boost::multiprecision;

int main() {
    mp::mpz_int n;
    std::cin >> n;
    n = n*2;
    std::cout << n << "\n";
}