Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Duże liczby i biblioteka GMP - problem z kompilacją(?)

Ostatnio zmodyfikowano 2016-06-20 21:07
Autor Wiadomość
oxygenium79
Temat założony przez niniejszego użytkownika
Duże liczby i biblioteka GMP - problem z kompilacją(?)
» 2016-06-04 18:44:32
Dzień dobry, pierwszy raz na forum, nie bijcie. :-)
Wymyśliłem sobie, że napiszę programik, który będzie znajdował kolejne liczby pierwsze. Programik mam i działa, ale chciałem go teraz rozszerzyć na liczby większe niż "long long".

Udało mi się zainstalować bibliotekę GMP, ale nie do końca to działa (albo ja nie umiem).
Zacznę od tego, co działa (to nie jest cały programik oczywiście, na razie sprawdzam, jak ogarnąć GMP i duże liczby):
C/C++
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <gmp.h>

int main()
{
    mpz_t liczba;
    mpz_init_set_str( liczba, "23563453453643564564564563", 10 );
    mpz_t granica;
    mpz_init_set_str( granica, "0", 10 );
    mpz_t dzielnik;
    mpz_init_set_str( dzielnik, "2", 10 );
    mpz_t wynik;
    mpz_init_set_str( wynik, "0", 10 );
   
    mpz_sqrt( granica, liczba );
   
    mpz_div( wynik, liczba, dzielnik );
   
    gmp_printf( "%s is an liczba %Zd\n", "here", liczba );
    gmp_printf( "%s is an granica %Zd\n", "here", granica );
    gmp_printf( "%s is an dzielnik %Zd\n", "here", dzielnik );
    gmp_printf( "%s is an wynik %Zd\n", "here", wynik );
   
    return 0;
}

Tylko że to są liczby całkowite, a mi są potrzebne zmiennoprzecinkowe (bo muszę sprawdzać resztę po dzieleniu, pierwiastek kwadratowy itp.).
Zamieniłem więc "mpz" na "mpf", czyli:
C/C++
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <gmp.h>

int main()
{
    mpf_t liczba;
    mpf_init_set_str( liczba, "23563453453643564564564563", 10 );
    mpf_t granica;
    mpf_init_set_str( granica, "0", 10 );
    mpf_t dzielnik;
    mpf_init_set_str( dzielnik, "2", 10 );
    mpf_t wynik;
    mpf_init_set_str( wynik, "0", 10 );
   
    mpf_sqrt( granica, liczba );
   
    mpf_div( wynik, liczba, dzielnik );
   
    gmp_printf( "%s is an liczba %Zd\n", "here", liczba );
    gmp_printf( "%s is an granica %Zd\n", "here", granica );
    gmp_printf( "%s is an dzielnik %Zd\n", "here", dzielnik );
    gmp_printf( "%s is an wynik %Zd\n", "here", wynik );
   
    return 0;
}

Próba kompilacji i wywala windowsowy błąd: "program xxxx.exe przestał działać".
A w konsoli:
here is an liczba
"Process returned -1073741819 (0xC0000005)   execution time : 1.325 s
Press any key to continue."

Czy ktoś mógłby mnie naprowadzić na rozwiązanie?
Dzięki z góry!
P-148863
michal11
» 2016-06-04 19:07:52
Źle wyświetlasz liczbę.

% Zd
 zamień na
% Ff

nie jestem na 100% pewny czy zadziała, w razie czego masz: https://gmplib.org/manual​/Formatted-Output-Strings.html
P-148864
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-04 20:10:22
Pomogło!
To znaczy prawie.
Bo co prawda nie wywala błędu, ale to co wypisuje niezbyt jest chyba dobre:
C/C++
mpf_t liczba1;
mpf_t liczba2;
mpf_t liczba3;
mpf_init_set_str( liczba1, "25", 10 );
mpf_init_set_str( liczba2, "123123123123123123123123123123123123123", 10 );
mpf_init_set_str( liczba3, "0", 10 );

mpf_add( liczba3, liczba1, liczba2 );


gmp_printf( "%s is an mpf %Ff\n", "here", liczba1 );
gmp_printf( "%s is an mpf %Ff\n", "here", liczba2 );
gmp_printf( "%s is an mpf %Ff\n", "here", liczba3 );

Otrzymujemy po kompilacji:

here is an mpf 25.000000
here is an mpf 123123123123123123123000000000000000000.000000
here is an mpf 123123123123123123123000000000000000000.000000

Process returned 0 (0x0)   execution time : 0.001 s
Press any key to continue.

Liczba 1 się zgadza, liczba 2 już nie bardzo, a 3 to już w ogóle.
Co dalej?
P-148865
mateczek
» 2016-06-04 20:53:42
A to musi być w C??
c++ nie chcesz??
C/C++
#include <gmpxx.h>
#include <iostream>
using namespace std;
int main( void )
{
    mpf_class a, b, wynik;
    a = "23563453453643564564564563.0";
    b = 10;
    cout << "wynik = " << a / b << endl;;
    return 0;
}

https://www.youtube.com/watch​?v=Mr6yAf9XpE0


wynik = 2.35635e+24
Naciśnij <RETURN> aby zamknąć to okno...

aby mieć wsparcie dla c++ trzeba bodajże podczas kompilacji dać enable-cxx jest w helpie
P-148868
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-04 23:29:27
Problem nr 1:
Nie mam pliku "gmpxx.h",mam "gmp.h".

Zrobiłem tak:

C/C++
#include <gmp.h>
#include <iostream>
using namespace std;
int main( void )
{
    mpf_class a, b, wynik;
    a = "23563453453643564564564563.0";
    b = 10;
    cout << "wynik = " << a / b << endl;;
    return 0;
}

Wynik:
In function 'int main()':|
6|error: 'mpf_class' was not declared in this scope|
6|error: expected ';' before 'a'|
7|error: 'a' was not declared in this scope|
8|error: 'b' was not declared in this scope|
||=== Build finished: 4 errors, 0 warnings (0 minutes, 0 seconds) ===|
P-148871
carlosmay
» 2016-06-04 23:42:12
Spróbuj tak sformatować wyjście:
gmp_printf( "%s is an mpf %Ff.0\n", "here", liczba2 );
P-148872
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-05 00:06:08
Teraz wyszło:

here is an mpf 25.000000.0
here is an mpf 123123123123123123123000000000000000000.000000.0
here is an mpf 123123123123123123123000000000000000000.000000.0

Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.
P-148873
Elaine
» 2016-06-05 01:54:21
MPF ma skończoną precyzję. Skoro domyślna ci nie pasuje, to ją zmień.

Tylko że to są liczby całkowite, a mi są potrzebne zmiennoprzecinkowe (bo muszę sprawdzać resztę po dzieleniu, pierwiastek kwadratowy itp.).
To brzmi jak problem XY. Do szukania liczb pierwszych powinny wystarczyć ci liczby całkowite.
P-148874
« 1 » 2 3 4 5 6
  Strona 1 z 6 Następna strona