Avatar billede anykey Nybegynder
06. december 2003 - 19:33 Der er 10 kommentarer

Kæmpe tal i C

Hej - Jeg undrer mig over, hvorfor jeg ikke kan kompilere programmer, der indeholder store tal. Tag fx følgende eks.:
******************
#include <stdio.h>

int main()
{
  long double n = 1203102312...  (et tal med over 100 cifre);
printf("%i",n);
}
******************
Min compiler kommer med følgende fejl "warning: integer constant out of range" i den linje, jeg tilskriver variablen n.

Hvordan kan jeg så håndtere store tal i C?
Avatar billede razersedge Nybegynder
06. december 2003 - 19:45 #1
Grænsen for en double er 2.2e-308 til 1.8e308.

Jeg har ikke selv arbejdet med så store tal som du snakker om, men jeg ved der skulle være noget der vist kaldes BigInt til brug ved store tal. Om det også virker i C er jeg ikke istand til at svare på, som sagt har ingen erfaringer med det.

Søgning på google gav følgende:
http://www.google.dk/search?hl=da&ie=UTF-8&oe=UTF-8&q=bigint+%2BC&btnG=Google-s%C3%B8gning&meta=
Avatar billede Slettet bruger
06. december 2003 - 19:49 #2
Tjah, jeg ved ikke hvordan du håndterer store tal i C, men jeg kan i det mindste forklare dig hvorfor du ikke kan håndtere tal med omtrent 100 cifre...

Eftersom en maskine i dag er 32-bit (nogle er 64-bit, men lad os som udgangspunkt se på dem som 32-bit), kan maskinen maksimalt håndtere tallet 2^32 = 4294967296 (som er langt fra 100 cifre langt)...

Jeg hjalp dig ikke men en løsning, men håber du forstår HVORFOR det ikke kan lade sig gøre... mvh Anders :-)
Avatar billede bertelbrander Praktikant
06. december 2003 - 19:50 #3
Min cygwin (en gcc for windows) har en bn.h (...\usr\include\openssl\bn.h) fil der definerer en BIGNUM.
Jeg ved ikke om andre gcc har en tilsvarende.
Avatar billede arne_v Ekspert
06. december 2003 - 20:02 #4
Først skal du gøre dig klar om du vil have store integer eller
store floating point tal.

Floating point tal større end 10^100 er ikke noget problem. Det kan en
double klare. Men præcisionen af en double er kun ca. 15 betydende cifre.
Og spørgsmålet er om det er acceptabelt for dig.

Hvis nej skal du ud og finde en big integer pakke. Dem er der lavet
rigtigt mange af.

C++ med klasser og operator overload er meget velegnet til at
lave big integer klasser i.

Jeg har f.eks. selv lavet sådanne klasser:
  http://www.vajhoej.dk/arne/eksperten/big/

For en mere professionel pakke se:
  http://www.swox.com/gmp/
Avatar billede anykey Nybegynder
06. december 2003 - 21:06 #5
arne_v> Takker - det var lige det, jeg ledte efter! Jeg har kompileret og installeret GMP. Efterfølgende ville jeg prøve deres test-eksempel, der er beskrevet i INSTALL.Jeg kan sagtens kompilere det med gcc test.c -lgmp, men når jeg kører ./a.out får jeg: error while loading shared libraries: libgmp.so.3 - nogen idé om, hvad der er gået galt?
Avatar billede arne_v Ekspert
06. december 2003 - 21:17 #6
Nu er jeg ikke så godt til Linux, men prøv at tilføje det directory
hvor libgmp.so.3 ligger til LD_LIBRARY_PATH
Avatar billede anykey Nybegynder
06. december 2003 - 21:33 #7
arne_v> tak igen ;-) nu kører det jo bare - hvis du vil have point må du lige smide et svar
Avatar billede arne_v Ekspert
06. december 2003 - 21:34 #8
svar
Avatar billede arne_v Ekspert
06. december 2003 - 21:35 #9
Hvis du skal bruge det meget så kan directory vist også tilføjes til /etc/ld.so.conf
Avatar billede arne_v Ekspert
25. juli 2004 - 23:27 #10
Så mangler du bare at acceptere svar
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