Avatar billede nidyahou Praktikant
25. oktober 2005 - 23:50 Der er 23 kommentarer og
2 løsninger

Forskellige små problemer

jeg har denne kode:

Var i:integer;
Var sum:double;
Var pi:double;
Var t1:integer;
Var t2:integer;

begin
t1 := GetTickCount;
sum := 1;
    For i := 1 To StrToInt(Edit1.Text) Do
    Begin
        If i Mod 2 = 0 Then
            sum := sum + 1 / (2 * i + 1)
        Else
            sum := sum - 1 / (2 * i + 1)
    End;
    pi := 4 * sum;
t2 := GetTickCount;

Label3.Caption := IntToStr(t2-t1) + ' Millisekunder';
Memo1.Text := FloatToStr(pi);


mit problem er, at når det tal brugeren indtaster bliver "højt nok" nægter programmet at eksekvere handlinger... Hvorfor, og hvordan kan jeg stoppe det?

Derudover har jeg på fornemmelsen at det kun er noget af det taloutput jeg burde på der udskrives, hvordan sikrer jge at den skriver hele tallet?
Avatar billede arne_v Ekspert
25. oktober 2005 - 23:55 #1
prøv:

FloatToStrF(pi, ffFixed, 18, 16)
Avatar billede tolderlund Nybegynder
26. oktober 2005 - 09:37 #2
Som du selv har bemærket er der flere problemer med din kode.
1. Variabel "i" er en integer. Den kan maks gå op til ca 2 mia. Se det præcise tal i hjælpen under integer types. Så hvis du indtaster et større tal i Edit1 går det galt. Kompiler dit program med range checking slået til i compiler options, så vil programmet fortælle dig det når tallet bliver for stort.
2. Variabel "pi" og "sum" er double. En double er en floating point variabel som kan indeholde meget små og meget store tal, til gengæld er de upræcise. De kan kun indeholde et begrænset antal præcise cifre. Jeg sidder ikke lige med Delphi ved mig, men det noget med 8-9 cifre, men det kan du se i hjælpen. Derfor duer det simpelthen ikke at bruge floating point til at beregne PI hvis det er det du forsøger.
Du er nødt til at bruge et math library der kan håndtere tal med mange cifre. Sådan et har Delphi ikke indbygget, det må du lede efter på nettet.
Avatar billede arne_v Ekspert
26. oktober 2005 - 11:57 #3
en double skulle gerne kunne tage en 15-16 cifre
Avatar billede tolderlund Nybegynder
26. oktober 2005 - 12:40 #4
16 cifre er stadig ikke ret meget hvis man vil udregne pi.
Avatar billede nidyahou Praktikant
26. oktober 2005 - 14:28 #5
math library?? hjælp... hvad vil det sige, kan du evt. hjælpe mig med det?
Avatar billede nidyahou Praktikant
26. oktober 2005 - 14:31 #6
jeg skal gerne finde ud af den tid det tager at udregne 220 præcise decimaler :D:D Derfor skal jeg have fat i et stoooooort tal
Avatar billede arne_v Ekspert
26. oktober 2005 - 14:36 #7
så mange cifre så skal du have fat i en "bignum" pakke
Avatar billede arne_v Ekspert
26. oktober 2005 - 14:36 #8
Avatar billede nidyahou Praktikant
26. oktober 2005 - 14:39 #9
hvordan ville du foreslå at jeg koblede den sammen med min kode? :D
Avatar billede nidyahou Praktikant
26. oktober 2005 - 14:40 #10
iøvrigt så er den formel ikke helt som

4 * (1/3-1/5+1/7 osv...)
fordi indtaster man 1 så får man 2,6666 hvor det jo burde være 4
Avatar billede arne_v Ekspert
26. oktober 2005 - 14:44 #11
nej

1 gennemløb giver

4 * (1 - 1/3) = 4 * 2/3 = 8/3 = 2.66666
Avatar billede arne_v Ekspert
26. oktober 2005 - 14:44 #12
hvis du indtaster 0 bør du få 4
Avatar billede nidyahou Praktikant
26. oktober 2005 - 16:33 #13
hvordan ville du foreslå at jeg flettede det der big integer og min kode sammen
Avatar billede mtj111 Novice
26. oktober 2005 - 18:03 #14
Du kan vist også bare finde en anden udregnings-metode:

http://www.matematiksider.dk/pi.html#hexadecimaler

Med denne formel kan du forudsige et hvilket som helst decimal af pi, uden at kende de foregående.
Altså må man først kunne finde decimal 1, og skrive den. Derefter decimal 2 osv...

Eller kan det ikke lade sig gøre???

Michael
Avatar billede tolderlund Nybegynder
26. oktober 2005 - 18:13 #15
I kan finde et PI program med Delphi source på min hjemmeside:
http://finn.mobilixnet.dk/delphi/
Avatar billede mtj111 Novice
26. oktober 2005 - 18:24 #16
Jeg kan da også lige ligge min ud:
Min er ligesom tolderlunds også baseret på en unit, fra et sted jeg ikke kan huske.

Men den kommer først på nettet kl 18:30, da den filehost jeg bruger har tekniske problemer i øjeblikket (serveren er fuld, men tømmes hver ½ time)...

Michael
Avatar billede tolderlund Nybegynder
26. oktober 2005 - 18:30 #17
I øvrigt er programmet ikke specielt optimeret. Ikke af mig i hvert fald.
Desuden kan det nemt blive noget nonsens at måle tiden, da tiden afhænger af maskinens hastighed og hvad maskinen laver af andre ting samtidig.
Så hvis man måler at det tager 10 ms at udregne x antal decimaler, hvad fortæller det så? (Svar: Ingenting)
Avatar billede mtj111 Novice
26. oktober 2005 - 18:35 #18
Hvordan måler du da tid?
Avatar billede tolderlund Nybegynder
26. oktober 2005 - 18:42 #19
På samme måde som spørgeren, med GetTickCount.
Men det ændrer ikke ved at det ikke forstæller særlig meget, især fordi resultat påvirkes af mange ting, herunder hvor mange andre processer der kører samtidig (på en almindelig windows kører temmelig mange processer) og cpu cache (eller hvad det hedder). Så kører man programmet flere gange kan man se at tiden ikke er den samme hver gang, det er simpelthen for upræcist.
Avatar billede mtj111 Novice
26. oktober 2005 - 18:55 #20
OK

Øv... jeg nåede ikke at ligge filen ud... Der er jo selvfølgelig pres på serveren hver ½ time, da der er mange andre der også vil have sine filer ud...
Avatar billede tolderlund Nybegynder
26. oktober 2005 - 19:03 #21
En filosofisk kommentar om beregningstiden:
Hvis man vil finde ud af hvor lang tid det tager at beregne 220 decimaler, så lad os sige at 3 personer kører programmet på hver sin pc. Hver pc har selvfølgelig forskellige specifikationer. Hvor lang tid tager beregningen?
Person 1: 20 ms
Person 2: 40 ms
Person 3: 10 ms
Tre forskellige resultater! De kan da ikke have ret alle tre? Eller kan de?
Hvis kun en har ret, hvor lang tid tager det så?
Hvis alle 3 har ret, hvor lang tid tager det så?
Avatar billede mtj111 Novice
26. oktober 2005 - 19:08 #22
Tjah... Det har du fuldtændig ret i...
men,
hvis nu computeren udregner f.eks. 1000000 decimaler, og det tager 55 min (hvilket det gør på min PC), så vil man vide hvor lang tid det tog... Mennesket er jo et nysgerrigt væsen, og vil gerne vide hvor lang tid f.eks. det tog at udregne tallet...

Michael ;-)
Avatar billede arne_v Ekspert
26. oktober 2005 - 19:10 #23
enhver af den slags målinger skal gentages N gange indtil den samlede eksekveringstid
er stor nok til at udjævne tilfældige schedulerings effekter (>10 sekunder så er den
normalt stabil nok)

det skal selvfølgelig køres på en maskine som ikke laver væsentligt andet (med >10
sekunder så betyder almindelige åbne programmer og services ikke noget)

man kan sagtens sammenligne forskellige algoritmer og sprog på samme maskine

man kan sagtens sammenligne samme algoritme og samme sprog på forskellige maskiner

hvis vil vil sammenligne forskellige algoritmer på forskellige maskiner, så er man
nødt til at skalere efter et mål for maskinens styrke
Avatar billede mtj111 Novice
26. oktober 2005 - 20:04 #24
Avatar billede nidyahou Praktikant
26. oktober 2005 - 20:51 #25
TIl jer folk > faktidsk er det lige præcis den enkelte computers udregningstid der er interessant, jeg er ikke interesseret i noget endegyldigt svar, eller gennemsnit, men hvis jeg har specs. på forskellige computere bliver det straks super sjovt... Fx vil DDR(Double Data Ram)-Ram jo kunne gøre det meget hurtigere end SDR(Single Data Ram)-Ram... Hehe, meget sjovt :D
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