Avatar billede sievers Nybegynder
02. marts 2009 - 22:22 Der er 31 kommentarer og
1 løsning

datatype c++

Findes der en datatype som kan holde et meget langt tal, i c++? Måske nærmest et uendeligt tal?
Avatar billede bertelbrander Praktikant
02. marts 2009 - 22:30 #1
Nej, der findes ingen standard data type der kan holde meget store heltal.

Der findes en del biblioteker som man kan bruge, de kaldes normalt "bignum", prøv at søge på google.
Avatar billede arne_v Ekspert
02. marts 2009 - 23:44 #2
En oplagt mulighed er GMP biblioteket som:
- både kan bruges fra C og C++
- skulle performe godt

Hvis du arbejder på Linux skulle den være lige til at hente og bruge.

Arbejder du på Windows er det lidt mere tricky. Mit forslag er at du så bruger cygwin GCC som compiler - den kommer med GMP. Med en anden compiler kan du komme til at arbejde lidt på at få GMP bygget.
Avatar billede sievers Nybegynder
03. marts 2009 - 18:53 #3
GMP har jeg prøvet at hente, men det virker ikke til lige at gå til, måske fordi jeg bruger windows. Jeg er i hvert fald ikke lige klar over hvordan jeg skal gribe det an.
Jeg fandt et andet bibliotek, ttmath, som man bare kunne hente ind, men det kunne kun tage 20 pladser. Findes der andre som kan tage flere, men ligeså nemme at få til at virke?
Avatar billede arne_v Ekspert
03. marts 2009 - 19:02 #4
Hvis du vaelger cygwin med GMP, saa er det klart til brug uden videre.

Og ret nemt at bruge.
Avatar billede sievers Nybegynder
03. marts 2009 - 19:11 #5
Jeg prøver at kigge på det igen senere i aften.
Avatar billede arne_v Ekspert
04. marts 2009 - 01:03 #6
Et lille kode snippet:

#include <iostream>

using namespace std;

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

mpf_class pow(mpf_class x, unsigned int n)
{
    mpf_t res;
    mpf_init(res);
    mpf_pow_ui(res, x.get_mpf_t(), n);
    mpf_class realres(res);
    mpf_clear(res);
    return realres;
}

int main()
{
    mpf_class two(2, 1000);
    cout << two << endl;
    cout << sqrt(two) << endl;
    cout << pow(two, 2) << endl;
    return 0;
}
Avatar billede sievers Nybegynder
04. marts 2009 - 18:12 #7
Hvor finder jeg compileren cygwin GCC henne i GMP pakken?
Avatar billede arne_v Ekspert
04. marts 2009 - 18:18 #8
Omvendt.

Du henter og installerer cygwin og saa faar du GMP med.

:-)
Avatar billede arne_v Ekspert
04. marts 2009 - 18:18 #9
Avatar billede sievers Nybegynder
04. marts 2009 - 19:01 #10
Så er det nok det jeg har gjort forkert:-)
Avatar billede sievers Nybegynder
04. marts 2009 - 19:23 #11
Hvordan bruger jeg compileren? Jeg er ikke lige klar over hvad jeg skal skrive i vinduet der åbner.
Avatar billede arne_v Ekspert
04. marts 2009 - 19:32 #12
Hvis du er skrap Linux bruger saa abbner du den bash prompt du har faaet et ikon til.

Hvis du er en helt normal Windows bruger saa:
- aabner du en almindelig kommandoprompt
- tilfoejer C:\cygwin\bin (eller hvor du nu har installeret) til PATH
- commpiled med:

g++ foobar.cpp -lgmp -lgmpxx -o foobar.exe
Avatar billede sievers Nybegynder
04. marts 2009 - 19:44 #13
Jeg er ikke skrap linuxbruger så det bliver windowsmetoden.
Tilføj til path? Er det samme sted som f.eks. Java\jdk1.6.0_12\bin også er, hvor jeg så bare tilføjer det efter det? Og så skal jeg lige have den sidste linje igen. Skal jeg skrive alt det for at compile en fil?
Avatar billede arne_v Ekspert
04. marts 2009 - 19:54 #14
Det er helt det samme som Java bin dir.
Avatar billede arne_v Ekspert
04. marts 2009 - 19:55 #15
g++              kommando til C++ comppiler
foobar.cpp      dit program
-lgmp            GMP
-lgmpxx          GMP for C++
-o foobar.exe    den EXE som du bygger

Hvad vil du undvaere ?
Avatar billede sievers Nybegynder
04. marts 2009 - 20:21 #16
Nu vil den ikke godkende g++ som en kommando. Så jeg har gjort noget forkert, men hvad det er bøvler jeg med lige nu. Jeg har lagt C:\cygwin\bin i miljøvariabler/path. Måske dette ikke er det rigtige sted. Jeg kan heller ikke se g++ i mappen bin, så måske jeg slet ikke har fået installeret g++?
Avatar billede arne_v Ekspert
04. marts 2009 - 20:33 #17
Da du installerede cygwin - hvad valgte du at installere af options ?

Du kan vaelge mellem et par tusinder software pakker. Du skal minimum have C/C++ og GMP.

Du kan koere SETUP igen og opdatere din installation.
Avatar billede sievers Nybegynder
04. marts 2009 - 23:03 #18
Når jeg prøver at compilerer den kode du tidligere har foreslået, kommer den med denne følgende fejlmeddelelse:

C:\Users\"navn"\Desktop\c++>g++ test.cpp -lgmp -lgmpxx -o test.exe
test.cpp:5:17: gmp.h: No such file or directory
test.cpp:6:19: gmpxx.h: No such file or directory
test.cpp:8: error: `mpf_class' does not name a type
test.cpp: In function `int main()':
test.cpp:20: error: `mpf_class' undeclared (first use this function)
test.cpp:20: error: (Each undeclared identifier is reported only once for each f
unction it appears in.)
test.cpp:20: error: expected `;' before "two"
test.cpp:21: error: `two' undeclared (first use this function)

Noget kunne tyde på at gmp ikke er blevet installeret og det selvom, når jeg er i vinduet, hvor man kan vælge hvad der skal installeres, så står den som installeret. Nogle forslag til hvad jeg kan gøre?
Avatar billede arne_v Ekspert
04. marts 2009 - 23:10 #19
Hm. Der skal nok saette lidt mere. Proev med:

g++ test.cpp -IC:\cygwin\include -LC:\cygwin\lib -lgmp -lgmpxx -o test.exe
Avatar billede arne_v Ekspert
04. marts 2009 - 23:10 #20
stort I ikke lille L
Avatar billede sievers Nybegynder
04. marts 2009 - 23:42 #21
Nej desværre, det hjalp ikke. Det virker som om den ikke vil have både gmp og g++ installeret samtidig, fordi hver gang jeg installerer den ene og så starter setup igen, for at installere gmp, så virker g++ lige pludselig ikke mere og lige omvendt jeg prøver at installere g++.
Avatar billede arne_v Ekspert
05. marts 2009 - 02:30 #22
Hvad hvis du sletter og installerer begge samtidigt.

Hvis du har masser af diskplads og internet båndbredde så installer "da ganze molevitten".
Avatar billede sievers Nybegynder
05. marts 2009 - 23:15 #23
Efter mange forsøg med cygwin og efter at have prøvet at følge en guide til et andet program, som også skulle få gmp til at virke, fandt jeg denne hjemmeside og hentede simpelthen de filer jeg skulle bruge derfra. Jeg tror da i hvert fald det virker nu, koden fra før bliver compilet. Jeg har ikke helt gennemskuet hvad programmet gør?
Og så skal du lige huske at lægge et svar også arne.

Til andre interesserede er hjemmesiden jeg brugte:
http://progressive-living.com/opensource/gmp/gmp.html
Avatar billede sievers Nybegynder
05. marts 2009 - 23:20 #24
Jo nu lurede jeg alligevel hvad programmet gør, men desvæære så skriver den ikke svaret med alle cifrer, men 2^500 udkommer som 3.27339e+150, men jeg ville gerne have haft alle cifrer.
Avatar billede arne_v Ekspert
05. marts 2009 - 23:28 #25
#include <stdio.h>

#include <gmp.h>

int main()
{
    mpf_t two, powtwo;
    mpf_set_default_prec(10000);
    mpf_init_set_si(two, 2);
    mpf_init(powtwo);
    mpf_pow_ui(powtwo, two, 500);
    gmp_printf("%Ff\n", powtwo);
    mpf_clear(two);
    mpf_clear(powtwo);
    return 0;
}

udskriver:

3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376.000000
Avatar billede arne_v Ekspert
05. marts 2009 - 23:31 #26
Og hvis int:

#include <stdio.h>

#include <gmp.h>

int main()
{
    mpz_t two, powtwo;
    mpz_init_set_si(two, 2);
    mpz_init(powtwo);
    mpz_pow_ui(powtwo, two, 500);
    gmp_printf("%Zd\n", powtwo);
    mpz_clear(two);
    mpz_clear(powtwo);
    return 0;
}

3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
Avatar billede arne_v Ekspert
05. marts 2009 - 23:31 #27
Og et svar.
Avatar billede arne_v Ekspert
05. marts 2009 - 23:31 #28
Mine eksempler var så C ikke C++, men de virker også i C++.
Avatar billede arne_v Ekspert
05. marts 2009 - 23:42 #29
Men det kan naturligvis også laves mere C++'sk i C++ !

#include <iostream>

using namespace std;

#include <gmpxx.h>

int main()
{
    mpz_class two(2), powtwo(1);
    for(int i = 0; i < 500; i++) powtwo *= two;
    cout << powtwo << endl;
    return 0;
}
Avatar billede arne_v Ekspert
05. marts 2009 - 23:43 #30
Eller bedre:

#include <iostream>

using namespace std;

#include <gmpxx.h>

int main()
{
    mpz_class powtwo(1);
    for(int i = 0; i < 500; i++) powtwo *= 2;
    cout << powtwo << endl;
    return 0;
}
Avatar billede sievers Nybegynder
05. marts 2009 - 23:47 #31
Jeps den skrev to linjer med cifrer ud, så det kunne lade sig gøre. Tak for det arne.
Avatar billede sievers Nybegynder
05. marts 2009 - 23:57 #32
Jeg siger rigtig mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester