Переполнение GMP при использовании больших чисел - PullRequest
2 голосов
/ 02 марта 2012

Я работаю над программой для учета очень больших чисел (20 или более цифр) в C ++ и использую GMP для решения проблем переполнения.Моя программа работает хорошо для чисел около 10 цифр или меньше, но когда я набрасываю на нее 15-значное число, она взрывается.Я собираюсь свести мою программу к одной строке, например:

#include <iostream>
#include <stdio.h>
#include <gmp.h>
#include <gmpxx.h>

using namespace std;

int main()
{
    mpz_class n = 48112959837082048697; //this blows up
    return 0;
}    

Если я заменю эту строку на

mpz_class n = 12623773;

, тогда все будет работать нормально.

Вот ошибка:

$ g++ -o main main.cpp  -lgmpxx -lgmp
main.cpp: In function ‘int main()’:
main.cpp:21:19: error: conversion from ‘long long int’ to ‘mpz_class’ is ambiguous
/usr/include/gmpxx.h:1563:3: note: candidates are: __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(double)
/usr/include/gmpxx.h:1562:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(float)
/usr/include/gmpxx.h:1560:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(long unsigned int)
/usr/include/gmpxx.h:1559:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(long int)
/usr/include/gmpxx.h:1557:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(short unsigned int)
/usr/include/gmpxx.h:1556:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(short int)
/usr/include/gmpxx.h:1554:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(unsigned int)
/usr/include/gmpxx.h:1553:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(int)
/usr/include/gmpxx.h:1551:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(unsigned char)
/usr/include/gmpxx.h:1550:3: note:                 __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(signed char)

Кто-нибудь знает, как это исправить, чтобы я мог использовать большие числа?Я думал, что GMP должен был позволить что-то вроде 500 цифр, плюс или минус.

Спасибо!

1 Ответ

3 голосов
/ 23 марта 2012

Число, которое вы пытаетесь присвоить n, очевидно, слишком велико, чтобы вписаться в любой из стандартных целочисленных типов, что объясняет использование gmp, но это также означает, что вы (ваша программа) не сможете использоватьчисло как целое число в любом качестве (включая функции инициализации / назначения).Самый простой способ присвоить большое число mpz - использовать строковое литеральное представление этого числа:

mpz_class n;
n = "48112959837082048697";

Обратите внимание, что комбинированная инициализация / назначение не будет работать, т.е.*

Примечание: Вам не нужно включать stdio.h и gmp.h, так как они включены из iostream и gmpxx.h соответственно.

...