| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| jetzt auch in digital! Registriert seit: Jul 2001
Beiträge: 1.047
| Fehler beim subtrahieren von float-Werten
Ok, ich gebs ja zu... in Mathe war ich nie ein Genie. Jetzt bin ich aber trotzdem etwas verwirrt. Ich habe zwei float-Werte die ich aus der Datenbank ziehe und dann den einen Wert vom anderen abziehen möchte. Solange die Werte unterschiedlich sind gibt es kein Problem. Sobald die Werte allerdings gleich sind bekomme ich ein sehr seltsames Ergebnis: PHP-Code:
__________________ felix |
| | |
| | #2 (permalink) |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.326
|
woher deine zahlen auch immer stammen mögen, sie sind eben nicht identisch. sie müssen unterschiedliche 'vorgeschichten' haben. der rundungsfehler in der 13ten nachkommastelle kommt daher, weil computer binär rechnen und somit die eingaben vom 10er ins 2er-system umrechnen müssen und das ergebnis später wieder zurück. siehe auch: http://de.wikipedia.org/wiki/IEEE_754 die zahlen runden oder teste z.b. auf eine tolleranz: if (abs($wert1-$wert2)<1e10) {...
__________________ die ultimative antwort auf alle programmierfragen: der debugger mfg h.g.seib www.SeibsProgrammLaden.de Geändert von hgseib (27-07-2006 um 15:36 Uhr) |
| | |
| | #3 (permalink) |
| jetzt auch in digital! Registriert seit: Jul 2001
Beiträge: 1.047
|
Hmmm danke schonmal. Ich hatte mir die Zahlen mit var_dump() ausgeben lassen und hatte gedacht, dass beide Werte identisch sind (float(387.3)). Wusste nicht, dass es noch "versteckte" Nachkommastellen gibt.
__________________ felix |
| | |
| | #4 (permalink) |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.326
|
die werden normalerweisse zum runden das ausgabe benützt. ist halt so z.b. 1/3 =0.333333333... aber irgendwann ist kein speicherplatz mehr da - und das fehlt dann.
__________________ die ultimative antwort auf alle programmierfragen: der debugger mfg h.g.seib www.SeibsProgrammLaden.de |
| | |
| | #10 (permalink) |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.326
| Code: <?php
$wert1=8+4+2+1 +1/2+1/4+1/8+1/16;
$wert2=8+4+2+1 +1/2+1/4+1/8+1/17;
echo(($wert1-$wert2)."<br><br>");
//
$wert3=1/7;
for ($i=0;$i<64;$i++)
{ echo($wert3."<br>");
$wert3=$wert3*10;
$wert3-=floor($wert3);
}
?> die ausgabe bei 1/7 holt raus, was rauszuholen ist ;-) ist allerdings verfälscht, weil hier ja auch dezimal umgerechnet wird. wenn, dann muss man den speicherwert direkt ausgeben.
__________________ die ultimative antwort auf alle programmierfragen: der debugger mfg h.g.seib www.SeibsProgrammLaden.de |
| | |
| | #12 (permalink) | |
| Kaffee... Registriert seit: May 2004 Ort: de/en
Beiträge: 433
|
jop @ blub. stichwort typecasting würde meines erachtens helfen (runden natürlich auch). Zitat:
Geändert von x!sign.dll (27-07-2006 um 20:01 Uhr) | |
| | |
| | #13 (permalink) | |
| schnarchnase Registriert seit: Jan 2002 Ort: konstanz
Beiträge: 2.953
| Zitat:
... hier gibt's dann auch die erklärung für fließkomma-konvertierungen und die daraus entstehenden probleme: http://www.e-technik.fh-kiel.de/~dis...8/dig008_3.htm
__________________ perlen vor die säue. Geändert von rechtschreibfan (27-07-2006 um 21:36 Uhr) | |
| | |
| | #15 (permalink) |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 16.326
|
nettes thema (für mich), da kann man drüber reden ;-) "..Jede Zahl kann in binärschreibweise umgewandelt werden.." das ist wie mit dem papst seiner unschuld. kann man glauben - muss aber nicht. im dezimalsystem ist JEDE zahl darstellbar mit 1er, 10er, 100er, 1000er usw. kann man vergrössern bis ins unendliche. und verkleinert mit 10tel, 100stel, 1000stel usw. kann man auch bis ins unedliche verkleinern. im dualsystem ist die basis 10. im binärsystem ist die basis 2. ansonsten absolut identisch: 1er, 2er, 4er, 8er, 16er, 32er, 64er usw. und 1/2, 1/4, 1/8, 1/16, 1/32 usw. allgemein: basis=n n^x ... n^3+n^2+n^1+n^0 (hier kommt das komma) +n^-1+n^-2+n^3 ... n^-x also JEDE zahl ist in JEDEM system darstellbar. ok, bei gewissen zahlen wie z.b. PI kann's etwas länglicher werden, aber wenn man unendlich viele nachkommastellen abbilden kann, dann geht's. leider ist genau dass das broblem! wir können in der praxis leider NICHT unendlich viele nachkommastellen abbilden. auch wenn die computer in den letzten jahren mächtig viel speicherplatz dazu bekommen haben und irre viel schneller geworden sind. irgendwann ist nunmal schluss mit lustig und die darstellbarkeit der zahlen muss auf ein der sache angemessenes mass angepasst (== verfälscht) werden. siehe hier das ursprüngliche beispiel: weiss zwar nicht, welche werte gezählt wurden, aber wir diskutieren um eine unstimmigkeit in der 13ten nachkommastelle - also bitte, was sind wir denn für erbsenzählen? ;-) auch im realen leben werden zahlen ständig auf- und abgerundet und nicht mit 30.000 nachkommastellen angegeben. mit dem computer wird da also nichts neues eingeführt, sondern nur das 'normale' leben wiedergegeben.
__________________ die ultimative antwort auf alle programmierfragen: der debugger mfg h.g.seib www.SeibsProgrammLaden.de Geändert von hgseib (27-07-2006 um 22:23 Uhr) |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |