php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.03.2006, 14:47  
Benutzer
 
Registriert seit: 16.06.2004
Beiträge: 81
PHP-Kenntnisse:
Fortgeschritten
RcRaCk2k
RcRaCk2k eine Nachricht über ICQ schicken RcRaCk2k eine Nachricht über MSN schicken RcRaCk2k eine Nachricht über Yahoo! schicken
Standard PHP kann kein Mathe! ;)

Leute ich glaub ich raffs nichtmehr!

FEHLER-SCRIPT:
http://mitarbeiter.salzburg.seminar-...rack/kakke.php

200 - 200 ist meiner Meinung nach 0, und nicht 1.70530256582E-13!

Code:
<pre>
<?PHP

  // Scriptlocation:
  // http://mitarbeiter.salzburg.seminar-...rack/kakke.php

  for( $x = 4; $x > 2; $x-- ) {
    $a = 2.2;
    $b = floor(2.2);
    
    $intDoubleDetection = ($a - $b) * 1000;
    var_dump(
      $a,
      $b,
      $intDoubleDetection,
      floor($intDoubleDetection),
      (int)$intDoubleDetection,
      ($intDoubleDetection - (int)$intDoubleDetection)
    );
    
    exit();
    
  }
  
?>
</pre>
Wer weis wo der Fehler liegt?

Vielen Dank im Voraus.

Michael Rack
RcRaCk2k ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.03.2006, 14:52  
Erfahrener Benutzer
 
Registriert seit: 20.01.2005
Beiträge: 1.557
PHP-Kenntnisse:
Fortgeschritten
Buhmann ist zur Zeit noch ein unbeschriebenes Blatt
Buhmann eine Nachricht über ICQ schicken Buhmann eine Nachricht über MSN schicken
Standard

weißt du, wie der datentyp floor funktioniert? http://de.wikipedia.org/wiki/Gleitkommazahl
lies dir das durch, dann verstehst du den grund.
Buhmann ist offline   Mit Zitat antworten
Alt 23.03.2006, 14:54  
Erfahrener Benutzer
 
Benutzerbild von dsmcg
 
Registriert seit: 11.10.2005
Beiträge: 2.405
dsmcg sorgt für eine eindrucksvolle Atmosphäredsmcg sorgt für eine eindrucksvolle Atmosphäredsmcg sorgt für eine eindrucksvolle Atmosphäre
Standard

ist es nicht eigentlich der Prozessor der die Rechnung ausrechnet? und nicht die Programmiersprache ?!
__________________
Wie man Fragen richtig stellt
dsmcg ist offline   Mit Zitat antworten
Alt 23.03.2006, 15:15  
Benutzer
 
Registriert seit: 16.06.2004
Beiträge: 81
PHP-Kenntnisse:
Fortgeschritten
RcRaCk2k
RcRaCk2k eine Nachricht über ICQ schicken RcRaCk2k eine Nachricht über MSN schicken RcRaCk2k eine Nachricht über Yahoo! schicken
Standard

Ich versteh das trozdem nicht.. Gut ich verwende jetzt die bcsub funktion, jetzt funktioniert auch alles schön...

Aber dann sag mir mal warum einfachste Mathematik nicht funktioniert:
Code:
<pre>
<?PHP

  // Scriptlocation:
  // http://mitarbeiter.salzburg.seminar-...ack/kakke2.php
  
  $a = 200.01;
  $b = 200;
  $c = $a - $b;
  var_dump( $c );
  
?>
</pre>
Ausgabe = float(0.00999999999999)
http://mitarbeiter.salzburg.seminar-...ack/kakke2.php
RcRaCk2k ist offline   Mit Zitat antworten
Alt 23.03.2006, 15:48  
Erfahrener Benutzer
 
Registriert seit: 20.01.2005
Beiträge: 1.557
PHP-Kenntnisse:
Fortgeschritten
Buhmann ist zur Zeit noch ein unbeschriebenes Blatt
Buhmann eine Nachricht über ICQ schicken Buhmann eine Nachricht über MSN schicken
Standard

das wurde doch auf wikipedia erklärt. eine floatzahl wird als
m*2^e abgespeichert, wobei m und e ganzzahlen sind. Es gibt eben Zahlen, die sich so nicht exakt speichern lassen. wenn du das nicht willst, sach halt, dass du integer zahlen haben willst.
Buhmann ist offline   Mit Zitat antworten
Alt 23.03.2006, 16:31  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

$a = 2.2;
$b = floor(2.2);

$intDoubleDetection = ($a - $b) * 1000;
settype($intDoubleDetection, "integer");



Obiger Zusatz sollte (mit etwas Glück) die Näherungsprobleme umgehen. Besser ist natürlich eine sauberere Lösung mittels ordentlicher Funktionen (round und Konsorten) unter Verwendung der gewünschten Nachkomastellen.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline   Mit Zitat antworten
Alt 23.03.2006, 22:48  
Gast
 
Beiträge: n/a
Standard

dieselben Probleme tauchen auch bei JavaScript auf oder in alten, höheren DOS-Programmiersprachen die einen 32-Bit-Rechner auf einem 8-Bit-System simulierten. Ursache war immer der falsche Variablentyp.

wenn man sich mal mit einem Hex-Editor die Zahlen anzeigen lässt, findet man auch schnell heraus warum. Wenn man dan aus einer 8-Bit-Zahl (200) eine 64-Bit-Zahl macht (3.414E-13) dann kommt das richtige Ergebnis als 64-Bit-Zahl heraus.

11001000-11001000 ist 00000000 also richtig 0
setzt man vor die 11001000 eine undefinierte 56-Bit-Reihe und im Speicher wäre da noch was, schreibt er nicht in den Speicher hat aber den Platz reserviert und liest das aus, was noch da ist.

nur zum Verständnis ein Erklärungsversuch -200-200 :

minus 200 wäre dann als Byte 111000 oder 00111000 oder
11111111111111111111111111111111111111111111111111 11111100111000
wenn man von diesem 32-Bit-Code ein 8-Bit-Wert (int) mit dem Wert 200 also 00111000 abzieht käme dann
11111111111111111111111111111111111111111111111111 11111100000000
heraus. Das wäre dann 18446744073709551360 aber nicht -400 !

nun mache das man mal mit 64-Bit und positiven Zahlen
  Mit Zitat antworten
Alt 23.03.2006, 22:52  
Erfahrener Benutzer
 
Benutzerbild von dsmcg
 
Registriert seit: 11.10.2005
Beiträge: 2.405
dsmcg sorgt für eine eindrucksvolle Atmosphäredsmcg sorgt für eine eindrucksvolle Atmosphäredsmcg sorgt für eine eindrucksvolle Atmosphäre
Standard

also nochmal ne ernste Frage, rechnet nicht der Prozessor?

Es rechnet doch nicht die Programmiersprache..
__________________
Wie man Fragen richtig stellt
dsmcg ist offline   Mit Zitat antworten
Alt 23.03.2006, 23:18  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.234
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

@aberchen. Prinzipiell ist die Erklärung gut, aber in diesem Fall nicht zutreffend, da 1. PHP korrekt vorinitialisiert und b) das Problem nur bei Ganzzahligen Sachen auftreten, aber nicht bei Fliesskommazahlen.

@dsmcg. Letzlich rechnet immer der Prozessor. Wie kommt aber logischerweise auf die Programmiersprache an. C beispielsweise ist sehr prozessornah, weshalb eine Rechnung hier relativ transparent ist. Aber egal, PHP arbeitet hier auch relativ transparent. Es hat "nur" eine variable Zahlendrarstellung.
Das Hauptproblem ist immer, dass Fliesskommazahlen klassischerweise wie oben schon dargestellt in ein internes Format umgesetzt werden, dass nur Näherungen zulässt. Normalerweise wird dies berücksichtig, so dass eine gewisse Nachkommastellenzahl angenommen wird und dann entsprechend bei Ergebnissen gerundet wird. Problem ist, dass bei der Mulitplikation mit 1000 diese Näherung verlassen wird und damit die Rundung nicht mehr zuschlägt. Genau weiss ich es nicht, da auch die möglichen Näherungen variabel sind und ich nicht im Kopf habe, wie die Zend Engine effektiv arbeitet bzw. mit wieviel Bit die Fliesskommazahlen intern dargestellt werden. Ist auch egal.

Die Rechnung mit Ganzzahlen läuft anders, da die, wie aberchen schrieb, anders dargestellt werden und daher immer genau sind, solange die vorgesehene Bit-Breite nicht überschritten wird. Bei Divisionen wird eventuell ein Float aus einem Integer und damit gelten wieder die Näherungsprobleme.

bcsub arbeitet komplett anders, also mit anderen Zahlenrepräsentationen, was aber auch bedeutet, dass es die Näherungsprobleme nicht verhindert, nur soweit minimiert, dass sie bei "gängigen" Rechnungen nicht mehr auftreten. Aber Probleme haben die bc*- Funktionen ebenfalls. Zudem sind sie deutlich langsamer als die Prozessornahem Berechnungen.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline   Mit Zitat antworten
Alt 23.03.2006, 23:18  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von dsmcg
also nochmal ne ernste Frage, rechnet nicht der Prozessor?

Es rechnet doch nicht die Programmiersprache..
nee, eigentlich kann der Prozessor gar nicht rechnen, bzw. rechnet er anders, z.B. es wird ein Bit nach links verschoben, das kann +8 bedeuten oder mal 2.

1000 ist 8, eins nach links ist 10000 ist 16
2 Rechnungen ein Ergbnis

andere Rechnung:
1100 ist 12, eins nach links ist 10100 also 20
das ist 12+8 aber nicht 12*2

12*2 wäre 11000 also 2 mal um 1 nach links verschoben
natürlich hat die hardware heutiger Prozessoren Millionen von solchen Verschiebeoperatoren in Form von Flops fest eingebaut.
aber das Prinzip ist 1 +1 oder 1-1
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mathe Aufgabe matthros Off-Topic Diskussionen 15 23.03.2006 11:28
evtl. off-topic: PHP & Mathe PHP-Fortgeschrittene 7 28.06.2005 04:35
Mathe: Schleife in Formel faux Off-Topic Diskussionen 2 28.05.2005 00:00
Wie kann ich die Mathe Funktipn geteilt durch führen? PHP Tipps 2005 2 24.04.2005 20:17
Mathe Problem Streckenberechnung mit bewegung nilsfeld Off-Topic Diskussionen 24 10.03.2005 21:12
Mathe problem PHP Tipps 2007 2 03.01.2005 21:41

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php variabel rechnet nicht richtig sehr große zahl, 1.70530256582e-13 php, php bc runden math

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:11 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.