Zurück   Flashforum > Flash und Server > PHP und MySQL

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-07-2006, 15:25   #1 (permalink)
jetzt auch in digital!
 
Benutzerbild von .felix.
 
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:

// $wert1 ist float(387.3)
// $wert2 ist float(387.3)

$neu $wert1-$wert2;

// $neu ist float(1.70530256582E-13) 
Warum kommt da nicht ganz einfach 0 raus?
__________________
felix
.felix. ist offline   Mit Zitat antworten
Alt 27-07-2006, 15:33   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
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)
hgseib ist offline   Mit Zitat antworten
Alt 27-07-2006, 15:42   #3 (permalink)
jetzt auch in digital!
 
Benutzerbild von .felix.
 
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
.felix. ist offline   Mit Zitat antworten
Alt 27-07-2006, 15:49   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
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
hgseib ist offline   Mit Zitat antworten
Alt 27-07-2006, 15:53   #5 (permalink)
jetzt auch in digital!
 
Benutzerbild von .felix.
 
Registriert seit: Jul 2001
Beiträge: 1.047
Danke für deine Hilfe. Mit round() klappts dann... aber gibt es nicht wenigstens zum Debuggen die Möglichkeit sich mehr als die eine Nachkommastelle anzeigen zu lassen?
__________________
felix
.felix. ist offline   Mit Zitat antworten
Alt 27-07-2006, 15:56   #6 (permalink)
Inventar
 
Benutzerbild von Nightflyer
 
Registriert seit: Jul 2002
Beiträge: 6.882
echo statt var_dump?
__________________
(\__/)
(='.'=)
(")_(")
Nightflyer ist offline   Mit Zitat antworten
Alt 27-07-2006, 16:01   #7 (permalink)
jetzt auch in digital!
 
Benutzerbild von .felix.
 
Registriert seit: Jul 2001
Beiträge: 1.047
Nein, ändert nichts. Egal wie ich den Wert ausgebe, es sind immer 387.3
__________________
felix
.felix. ist offline   Mit Zitat antworten
Alt 27-07-2006, 16:44   #8 (permalink)
wuschelkopp
 
Registriert seit: Aug 2004
Beiträge: 1.468
number_format() oder printf() / sprintf() ?
firstlord18 ist offline   Mit Zitat antworten
Alt 27-07-2006, 16:52   #9 (permalink)
jetzt auch in digital!
 
Benutzerbild von .felix.
 
Registriert seit: Jul 2001
Beiträge: 1.047
Geht auch nicht...
__________________
felix
.felix. ist offline   Mit Zitat antworten
Alt 27-07-2006, 17:01   #10 (permalink)
Techniker
 
Benutzerbild von hgseib
 
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);
}
?>
bei diesem einfachen beispiel entsteht ein rundungsfehler, weil '1/17' nicht in das dualsystem passt. sinngemäss kann nicht jede dualzahl in eine dezimalzahl umgewandelt werden.

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
hgseib ist offline   Mit Zitat antworten
Alt 27-07-2006, 19:41   #11 (permalink)
chtulhu fhtagn!
 
Registriert seit: Mar 2006
Beiträge: 303
ist bei float nicht generell nen fehler drin? also nicht nur bei sowas (1/3 =0.333333333)

ich kann mich glaubich dran errinnern das zb. python 1 als 1.000000000009 dargestellt hat
__________________

Im Zweifelsfall plädiere ich auf Unzurechnungsfähigkeit
blub_tm ist offline   Mit Zitat antworten
Alt 27-07-2006, 19:56   #12 (permalink)
Kaffee...
 
Benutzerbild von x!sign.dll
 
Registriert seit: May 2004
Ort: de/en
Beiträge: 433
jop @ blub. stichwort typecasting würde meines erachtens helfen (runden natürlich auch).

Zitat:
sinngemäss kann nicht jede dualzahl in eine dezimalzahl
hm? belege? irgendwas, was diese aussage fundiert? hatte mal nen Vortrag über Binärsystem, dabei ist immer folgendes rausgekommen: "Jede Zahl kann in binärschreibweise umgewandelt werden."

Geändert von x!sign.dll (27-07-2006 um 20:01 Uhr)
x!sign.dll ist offline   Mit Zitat antworten
Alt 27-07-2006, 21:35   #13 (permalink)
schnarchnase
 
Registriert seit: Jan 2002
Ort: konstanz
Beiträge: 2.953
Zitat:
sinngemäss kann nicht jede dualzahl in eine dezimalzahl umgewandelt werden.
äh.... basiskonvertierung von ganzzahlen ist verlustfrei. dafür gibt's etliche beweise. dabei sind sogar die jeweiligen basen beliebig. bei fließkommazahlen ist das natürlich anders.

... 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)
rechtschreibfan ist offline   Mit Zitat antworten
Alt 27-07-2006, 22:03   #14 (permalink)
wuschelkopp
 
Registriert seit: Aug 2004
Beiträge: 1.468
müsste man nurnoch verstehen
firstlord18 ist offline   Mit Zitat antworten
Alt 27-07-2006, 22:17   #15 (permalink)
Techniker
 
Benutzerbild von hgseib
 
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)
hgseib ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele