25. oktober 2005 - 23:50Der 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;
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?
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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.
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...
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)
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.
Ø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...
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å?
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...
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
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
Synes godt om
Ny brugerNybegynder
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.