Avatar billede lassel Nybegynder
21. maj 2006 - 18:09 Der er 4 kommentarer og
1 løsning

Tillægsværdi ændrer sig med float, hvorfor?

Hej experter,

Jeg har en fin voldsom for-løkke til at simulere nogle kemiske reaktioner for mig over tid.

Som overordnede styrende indeks benytter jeg selvfølgelig tidsvariabler;

Eksempelvis sat til:
$DeltaT = 0.001;
$T = 60;

Simuleringen styres så af en for-løkke:
for ($tid = 0; $tid <= $T; $tid = $tid + $DeltaT) {

...

}

Input til hvad $DeltaT og $T skal være før forsøget har jeg brugt en html form til, denne del:

<b>DeltaT:</b><input type="float" name="DeltaT" value="0.001"><br>
<b>T:</b><input type="float" name="T" value="60"><br>

Som det kan ses har jeg sat type til float, da muligheden skal være åben for at bruge RIGTIG mange decimaler.

Problemet er så, at når jeg kører det som eksemplet med 0.001 og 60, så viser min logfil:

$LogTid = 1/$DeltaT;
if ($LogCount == $LogTid) {
fwrite($handle, "$tid;");

...

}

Der her er indstillet til at logge hver 1/$DeltaT'ne gang, dvs. i eksemplet hver 1000'ne gang, eller rettere sagt, hvert sekund.

Logfilen viser ikke 1;2;3;4;... osv. som den burde gøre.

Den viser 1;1.9999999999999;2.9999999999998;3.9999999999997;5;6.0000000000003;7.0000000000007;8.000000000001;9.0000000000005; osv...

Altså varierer tiden, omend meget lidt. Dette er dog kritisk da beregningsmodellen benytter tiden som faktorer og er meget følsom overfor de mindste fejl.

Men hvordan kan det være de ændrer sig denne lille smule? Det er da mystisk. Kan selvfølgelig brug round()-funktionen, men vil egentlig hellere forstå hvorfor den gør det.

Nogen der har en idé?
Avatar billede coderdk Praktikant
21. maj 2006 - 20:15 #1
Du kan ikke rigtig regne med floating point præcitionen: http://dk.php.net/float

"So never trust floating number results to the last digit and never compare floating point numbers for equality. If you really need higher precision, you should use the arbitrary precision math functions  or gmp functions instead."
Avatar billede lassel Nybegynder
21. maj 2006 - 21:01 #2
Tjaa, der var en fin forklaring. Står dog stadig uvis over hvorfor dælen float skal fungerer på den måde, rent programmeringsmæssigt, når hensigten med floats netop burde være dens præcision i arbejde med tal med rigtig mange decimaler, men sådan er denne verden nu engang, fuld af uforklarligheder og lappeløsninger hehe, men ellers ville det jo heller ikke være sjovt.

Du må gerne lægge svar coderdk, og tak. Burde selv have kigget på float-beskrivelsen på php.net, plejer også være det første sted jeg går forbi ;)
Avatar billede coderdk Praktikant
21. maj 2006 - 21:25 #3
Ok :) Nej, det er generelt sådan i computerverdenen, at du ikke kan stole blindt på floating point værdier, da det er aproximationer af det reele tal... Generelt er det de sidste decimaler du ikke kan stole på ;)
I PHP kan du bruge BCMath: http://dk.php.net/bc
Det kan [muligvis] give dig et pænere resultat...
Avatar billede coderdk Praktikant
21. maj 2006 - 21:26 #4
Lidt mere læsning her: http://en.wikipedia.org/wiki/Floating_point :)
Avatar billede lassel Nybegynder
21. maj 2006 - 21:32 #5
Ahhh, tjek, hehe, så dropper jeg floats for good og leger med bcmath.

Tak endnu en gang.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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