Avatar billede nubi19 Nybegynder
06. august 2002 - 18:55 Der er 7 kommentarer og
1 løsning

float ændrer værdi, hvorfor?

Jeg har lavet noget % uptime halløj, som skal udregne hvor mange % af tiden man bruger sin computer. Det ligger i et i forvejen (Så vidt jeg ved) fejlfrit program.
Koden er her:
                DecodeTime(Now(), NTim, NMin, NSek, NMSek);
                DecodeDate(Now(), NAar, NManed, NDag);
                FloatTim = FTim;
                FloatMin = FMin;
                FloatSek = FSek;
                YearUp = NAar - Year;
                MonthUp = NManed - Month;
                if (YearUp > 0)
                {
                        MonthUp = MonthUp + (12 * YearUp);
                }
                DayUp = NDag - Day;

                if (LigeTal(MonthUp) == true && Month > 2)
                {
                        DayUp = DayUp + (61 * (MonthUp / 2));
                }
                if (LigeTal(MonthUp) == true && Month <= 2)
                {
                        DayUp = DayUp + 59 + (((MonthUp - 2) / 2) * 61);
                        if (SkudAar(NAar) == true)
                        {
                                DayUp++;
                        }
                }
                if (LigeTal(MonthUp) == false && Month > 2)
                {
                        DayUp = DayUp + 30 + (((MonthUp - 1) / 2) * 61);
                        if (LigeTal(Month) == false)
                        {
                                DayUp++;
                        }
                }
                if (LigeTal(MonthUp) == false && Month <= 2)
                {
                        if (Month == 2)
                        {
                                DayUp = DayUp + 28 + (((MonthUp - 1) / 2) * 61);
                        }
                        if (Month == 1 && MonthUp == 1)
                        {
                                DayUp = DayUp + 31;
                        }
                        if (Month == 1 && MonthUp > 1)
                        {
                                DayUp = DayUp + 90 + (((MonthUp - 3) / 2) * 61);
                        }
                }
                TimUp = (24 * DayUp) + NTim - LTim;
                MinUp = NMin - LMin;
                SekUp = NSek - LSek;
                TimUp = TimUp + (MinUp / 60) + (SekUp / 3600);
                RealUp = FloatTim + (FloatMin / 60) + (FloatSek / 3600);
                PercentUp = RealUp / TimUp * 100;
                if (PercentUp > 100)
                {
                        PercentUp = 100;
                }
        sprintf(UpTime, "%f %", PercentUp);
        LblPercentUp->Caption = UpTime;

FTim, FMin & FSek er hvor længe computeren har kørt siden startdato & tid, startdato = Day, Month, Year.
StartTid = LTim, LMin, LSek.

LblPercentUp->Caption svinger mellem 99,x og 100,x %, også selvom jeg har resat programmet, så jeg ved den skulle vise 100 præcis (hvilket den også gør med jævne mellemrum)

Håber nogen kan/vil hjælpe mig, selvom jeg kun har 5 point :(
Avatar billede kichian Nybegynder
06. august 2002 - 19:05 #1
Det skyldes præcisionen på float. Du skal huske på at alle decimaltal er repræsenteret internt som en brøk. Derfor vil du støde på "underlige" tal der ikke er 100% det de skulle være.
Så du bliver nødt til at foretage afrunding på UpTime.
Avatar billede nubi19 Nybegynder
06. august 2002 - 23:33 #2
Hmmm jeg kan ikke bruge double istedet ?
Og btw. hvordan styrer jeg hvor mange decimaler jeg vil have på når jeg gør sådan her:

sprintf(UpTime, "%f %", PercentUp);

?
Avatar billede nubi19 Nybegynder
06. august 2002 - 23:34 #3
Med double mener jeg, at så er præcisionen jo større, men det vil nok aldrig afhjælpe det 100 % ?
Avatar billede nico26 Nybegynder
06. august 2002 - 23:55 #4
sprintf(UpTime, "%.2f %", PercentUp); //to decimaler
Avatar billede nubi19 Nybegynder
07. august 2002 - 00:26 #5
oki, mange tak begge 2 :)
Avatar billede kichian Nybegynder
07. august 2002 - 00:34 #6
Du har fuldstændig ret i at den absolutte præcision ikke bliver bedre med double. Det er det væsentlige at forstå med kommatal.

Du bliver derfor nødt til at foretage en afrunding på et fornuftigt decimal. Og så bruge det afrundede tal.

I Tyskland er der fx. regler om at alle regnskabstal afrundes til 5. decimal for at sikre at tallene bliver regnet ens på alle systemer.
Avatar billede nubi19 Nybegynder
07. august 2002 - 01:44 #7
Jeg har besluttet mig for at køre med 2 decimaler, og så har jeg smidt al den grumme kode ind i min timer, og sat start interval = 2 (da jeg bruger 1 til noget), fordi den fuckede op hvis man lukkede den inden den havde kørt det i timeren (selvom det i formcreate ligner på en prik, underligt.
Dette er selvf. lappe løsninger, men hvad dælen når de nu virker. Og underligt nok bruger programmet ikke mere hukommelse, selvom jeg har flyttet variablerne fra formcreate til timeren. Men så igen det er vel fordi den allokerer hele lortet fra starten, og så ikke får "free'et" hukommelsen igen når den er færdig med f.eks. formcreate.
Avatar billede nubi19 Nybegynder
07. august 2002 - 01:45 #8
Glemte helt det væsentlige: Nu hvor den ligger i timeren, rasler den ikke op og ned hele tiden, dvs. den er ret stabil nu, så det er jo fint. Og programmet bruger stadigvæk 00 % CPU (ifølge win xp's indbyggede måler).
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