|
| c++, long? Fra : Martin |
Dato : 28-07-04 20:03 |
|
Et program skal regne med op til 10 i ellevte potens og det kniber når vi
når den syvende/ottende potens. Så kan den ikke regne med længere. Jeg havde
en alm. float til start og har nu en long. Double går vistnok ikke så godt.
Hvad kan jeg gøre?
Mvh.
Martin
| |
Mogens Hansen (28-07-2004)
| Kommentar Fra : Mogens Hansen |
Dato : 28-07-04 20:53 |
|
"Martin" <mf_NO_Spima@digginet.dk> wrote:
> Et program skal regne med op til 10 i ellevte potens og det kniber når vi
> når den syvende/ottende potens. Så kan den ikke regne med længere. Jeg
havde
> en alm. float til start og har nu en long. Double går vistnok ikke så
godt.
> Hvad kan jeg gøre?
Jeg går ud fra at det er heltalsberegninger.
Du skal bruge mindst 37 bit til at repræsentere 1E11.
Har din compiler en 64 bit integer ?
Det kan enten være fordi det er en 64 bit platform hvor int kan være 64 bit
eller fordi den har en (compiler specifik) sprog udvidelse, som f.eks. "long
long"/"unsigned long long" eller "__int64".
Bemærk at "long long" er en del af C99 og dermed en sandsynlig del af C++ i
fremtiden.
Hvis din compiler ikke direkte understøtter 64 bit integerer kan man bare
lave sådan en type.
Det er formodentlig muligt at finde sådan en klasse et eller andet sted på
nettet.
Venlig hilsen
Mogens Hansen
| |
Martin (28-07-2004)
| Kommentar Fra : Martin |
Dato : 28-07-04 23:39 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:ce90bq$1n7p$1@news.cybercity.dk...
>
> "Martin" <mf_NO_Spima@digginet.dk> wrote:
>
> > Et program skal regne med op til 10 i ellevte potens og det kniber når
vi
> > når den syvende/ottende potens. Så kan den ikke regne med længere. Jeg
> havde
> > en alm. float til start og har nu en long. Double går vistnok ikke så
> godt.
> > Hvad kan jeg gøre?
>
> Jeg går ud fra at det er heltalsberegninger.
>
> Du skal bruge mindst 37 bit til at repræsentere 1E11.
>
> Har din compiler en 64 bit integer ?
> Det kan enten være fordi det er en 64 bit platform hvor int kan være 64
bit
> eller fordi den har en (compiler specifik) sprog udvidelse, som f.eks.
"long
> long"/"unsigned long long" eller "__int64".
>
> Bemærk at "long long" er en del af C99 og dermed en sandsynlig del af C++
i
> fremtiden.
>
> Hvis din compiler ikke direkte understøtter 64 bit integerer kan man bare
> lave sådan en type.
> Det er formodentlig muligt at finde sådan en klasse et eller andet sted på
> nettet.
>
>
> Venlig hilsen
>
> Mogens Hansen
>
Det er en TurboC++ version 3.0 hvis det hælper?
Mvh.
Martin
| |
Mogens Hansen (29-07-2004)
| Kommentar Fra : Mogens Hansen |
Dato : 29-07-04 20:31 |
|
"Martin" <mf_NO_Spima@digginet.dk> wrote:
[8<8<8<]
> Det er en TurboC++ version 3.0 hvis det hælper?
Det hjælper ikke - så vidt jeg husker har den ikke nogne 64 bit data heltal
type.
Du skal finde eller skrive en klasse.
Som Bertel Brander tidligere har været inde på kunne det være en god ide at
benytte en mere tidsvarende compiler.
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (29-07-2004)
| Kommentar Fra : Bertel Brander |
Dato : 29-07-04 23:31 |
|
Martin wrote:
> Det er en TurboC++ version 3.0 hvis det hælper?
Der findes et stort antal big-number biblioteker på nettet,
f.ex. denne:
http://www.uic.nnov.ru/~zny/arageli/
Den ser ud til at kunne oversætte med ældre versioner af
Turbo/BorlandC++, du bør bruge den version der ikke bruger
assembler, det er vist størst chance for at den vil virke.
/b
| |
Jacob Jensen (19-08-2004)
| Kommentar Fra : Jacob Jensen |
Dato : 19-08-04 19:52 |
|
> Et program skal regne med op til 10 i ellevte potens og det kniber når vi
> når den syvende/ottende potens. Så kan den ikke regne med længere. Jeg
> havde
> en alm. float til start og har nu en long. Double går vistnok ikke så
> godt.
> Hvad kan jeg gøre?
Jeg har lavet et lille testprogram. Det viser at du sagtens kan bruge både
float og double til at repræsentere 10^11. Jeg laver fire variabler og
sætter dem til den største værdi de kan have (sådan ca.) og skriver den ud
igen for at se om det gik godt. "int" og "long" er ens på min maskine. Hvad
er output fra dette program hos dig?
#include <iostream>
using namespace std;
int main()
{
cout << "size of unsigned int is " << sizeof(int) << " bytes" << endl;
cout << "size of unsigned long is " << sizeof(long) << " bytes" << endl;
cout << "size of float is " << sizeof(float) << " bytes" << endl;
cout << "size of double is " << sizeof(double) << " bytes" << endl;
unsigned int tal1 = 4294967295;
unsigned long tal2 = 4294967295;
float tal3 = 3.4028234663852886e+38;
double tal4 = 1.7976931348623158e+308;
cout << tal1 << endl;
cout << tal2 << endl;
cout << tal3 << endl;
cout << tal4 << endl;
return 0;
}
| |
Niels Dybdahl (20-08-2004)
| Kommentar Fra : Niels Dybdahl |
Dato : 20-08-04 08:50 |
|
> > Et program skal regne med op til 10 i ellevte potens og det kniber når
vi
> > når den syvende/ottende potens. Så kan den ikke regne med længere. Jeg
> > havde
> > en alm. float til start og har nu en long. Double går vistnok ikke så
> > godt.
> > Hvad kan jeg gøre?
>
> Jeg har lavet et lille testprogram. Det viser at du sagtens kan bruge både
> float og double til at repræsentere 10^11. Jeg laver fire variabler og
> sætter dem til den største værdi de kan have (sådan ca.) og skriver den ud
> igen for at se om det gik godt. "int" og "long" er ens på min maskine.
Hvad
> er output fra dette program hos dig?
float bruger normalt 4 bytes og regner med 6-7 cifre. Den kan sagtens regne
med større tal, men så mangler præcisionen i den anden ende.
long rækker til 9-10 cifre (op til ca 2 milliarder).
double bruger normalt 8 bytes og regner med 15-16 cifre.
Nogle compilere har en long long eller __int64 eller lignende som kan regne
med over 18 cifre.
Niels Dybdahl
| |
Martin (20-08-2004)
| Kommentar Fra : Martin |
Dato : 20-08-04 21:08 |
|
"Niels Dybdahl" <ndy@fjern.detteesko-graphics.com> skrev i en meddelelse
news:4125ad3a$0$160$edfadb0f@dtext02.news.tele.dk...
Nogle compilere har en long long eller __int64 eller lignende som kan regne
med over 18 cifre.
Ved du om turbo C++ 3.0 compileren kan int64?
jeg har brug for 999 gange 10^9 og det har den svært ved med double allerede
ved 10^8 alene, men igen, skal man så skifte mellem typer af variabler i til
samme rutine -regnestykke for at den regner ok i det lave område?.
Mvh.
Martin
| |
|
|