php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.01.2012, 19:03  
Benutzer
 
Registriert seit: 03.04.2011
Beiträge: 89
PHP-Kenntnisse:
Anfänger
Anima ist zur Zeit noch ein unbeschriebenes Blatt
Standard Probleme bei Zahlenüberprüfung

Hallo,

ich schreibe zurzeit an einer Klasse für Komplexe Zahlen in PHP. Ich bin fast fertig und es funktioniert soweit auch alles, das einzigste was mich stört ist, dass bei einem Beispiel, wo zwei Komplexe Zahlen miteinander dividiert werden, das Ergebnis "2 + 1i" herauskommt.
In meiner Methode toString() wird aber überprüft, ob der Imaginärteil 1 ist, aber aus welchem Grund auch immer gibt die Condition in diesem Fall false zurück...

Hier der Code:

PHP-Code:
<?php
/**
 * Complex Numbers
 *
 * @author        Manuel J.
 * @copyright    2012 Manuel J.
 * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
 */
 
class Complex {
    private 
$realPart;
    private 
$imagPart;
    
    public function 
__construct($realPart$imagPart) {
        
$this->realPart $realPart;
        
$this->imagPart $imagPart;
    }
    
    
// returns real part
    
public function getRealPart() {
        return 
$this->realPart;
    }
    
    
// returns imaginary part
    
public function getImagPart() {
        return 
$this->imagPart;
    }
    
    
// addition
    
public function add(Complex $cpx) {
        
$realPart $this->realPart $cpx->getRealPart();
        
$imagPart $this->imagPart $cpx->getImagPart();
        
        return new 
Complex($realPart$imagPart);
    }
    
    
// subtraction
    
public function sub(Complex $cpx) {
        
$realPart $this->realPart $cpx->getRealPart();
        
$imagPart $this->imagPart $cpx->getImagPart();
        
        return new 
Complex($realPart$imagPart);
    }
    
    
// multiplication
    
public function mul(Complex $cpx) {
        
$realPart $this->realPart $cpx->getRealPart() - $this->imagPart $cpx->getImagPart();
        
$imagPart $this->realPart $cpx->getImagPart() + $this->imagPart $cpx->getRealPart();
        
        return new 
Complex($realPart$imagPart);
    }
    
    
// division
    
public function div(Complex $cpx) {
        
$realPart = ($this->realPart $cpx->getRealPart() + $this->imagPart $cpx->getImagPart()) / pow($cpx->abs(), 2);
        
$imagPart = ($this->imagPart $cpx->getRealPart() - $this->realPart $cpx->getImagPart()) / pow($cpx->abs(), 2);
        
        return new 
Complex($realPart$imagPart);
    }
    
    
// absolute value
    
public function abs() {
        return 
sqrt(pow($this->realPart2) + pow($this->imagPart2));
    }
    
    
// conjugated value
    
public function conj() {
        
$realPart $this->realPart;
        
$imagPart $this->imagPart * (-1);
        
        return new 
Complex($realPart$imagPart);
    }
    
    
// converts complex number to string
    
public function toString() {
        if (
$this->realPart != 0) {
            if (
$this->imagPart 0) {
                if (
$this->imagPart == 1) {
                    return 
''.$this->realPart.' + i';
                }
                else {
                    return 
''.$this->realPart.' + '.$this->imagPart.'i';
                }
            }
            
            if (
$this->imagPart 0) {
                if (
$this->imagPart == -1) {
                    return 
''.$this->realPart.' - i';
                }
                else {
                    return 
''.$this->realPart.' - '.$this->imagPart * (-1).'i';
                }
            }
        }
        
        if (
$this->imagPart == 0) {
            return 
''.$this->realPart.'';
        }
        
        if (
$this->realPart == 0) {
            if (
$this->imagPart == 1) {
                return 
'i';
            }
            else {
                return 
''.$this->imagPart.'i';
            }
        }
    }
}

$z1 = new Complex(34);
$z2 = new Complex(21);
$z3 $z1->div($z2);
echo 
''.$z3->toString().'<br><br>';
?>
Anima ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 06.01.2012, 19:11  
php.de
Gast
 
Beiträge: n/a
Standard

Lass dir Imaginärteil ausgeben. Entweder wird dir 1 oder eine Zahl nahe 1 angezeigt, vermute ich mal.
  Mit Zitat antworten
Alt 06.01.2012, 19:45  
Benutzer
 
Registriert seit: 03.04.2011
Beiträge: 89
PHP-Kenntnisse:
Anfänger
Anima ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke, aber das habe ich schon versucht. Es wird 1 ausgegeben (ist laut gettype() vom Typ double).
Anima ist offline   Mit Zitat antworten
Alt 06.01.2012, 19:49  
php.de
Gast
 
Beiträge: n/a
Standard

Und da kommt dir nichts spanisch vor?

Nächste Hilfe.
Mach mal folgendes:

$i=$z3->getImagPart();
echo $i;
var_dump($i==1);

Dann überleg mal, welches generelles Problem es mit Fließkommazahlen gibt
  Mit Zitat antworten
Alt 06.01.2012, 23:59  
Benutzer
 
Registriert seit: 03.04.2011
Beiträge: 89
PHP-Kenntnisse:
Anfänger
Anima ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hm, vielleicht liegt es daran, dass ich einen Double mit einem Integer vergleiche?
Anima ist offline   Mit Zitat antworten
Alt 07.01.2012, 00:33  
php.de
Gast
 
Beiträge: n/a
Standard

Bei float-Werten ergeben sich immer Rundungsfehler bei Berechnungen. PHP ist zusätzlich insofern heimtückisch, dass eine ausgegebene 1 aus Sicht von PHP nicht unbedingt wirklich eine 1 sein muss. In Wirklichkeit kann es für PHP ein 0.999999999999 oder ein 1.0000000000000001 sein. Darum mein Hinweis mit diesem var_dump.

Lange Rede, kurzer Sinn: wenn du solche Berechnungen durchführen willst und dann auf ==1 vergleichen willst, musst du auf andere Techniken zurückgreifen. Entweder lässt du alles von einer anderen Programmiersprache ausrechnen, die exakte Berechnungen durchführen kann oder du greifst bei PHP in die Trickkiste, sofern das möglich ist.

Eine Möglichkeit, in PHP "genau" zu rechnen, ist mittels der bc-Funktionen. Ev. helfen sie dir weiter. Siehe http://php.net/manual/de/book.bc.php. Allerdings frage ich mich, ob das wirklich nötig ist. Muss man bei komplexen Zahlen unbedingt derartige Vergleiche anstellen?
  Mit Zitat antworten
Alt 07.01.2012, 01:55  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Je präziser du berechnungen durchführen und vergleichen willst, je nötiger wird bcmath.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 07.01.2012, 02:28  
php.de
Gast
 
Beiträge: n/a
Standard

Eigentlich hatte ich die Hoffnung, man würde genaue Werte erhalten, wenn man die Methoden abs und div als Funktion bzw. Prozedur in MySQL nachbilden und mit dem Datentyp DECIMAL(20,10) arbeiten würde. Leider nein. Auch ein ungenaues Ergebnis. Oder darf man dann bei der 10ten Nachkommastelle runden?

EDIT: Mit einem ROUND(..., 10) bekomme ich dann schöne Werte.

(Das war nur ein Experiment mit MySQL. bcmath ist höchstwahrscheinlich zu bevorzugen!)

Geändert von php.de (07.01.2012 um 02:38 Uhr).
  Mit Zitat antworten
Alt 07.01.2012, 10:10  
Benutzer
 
Registriert seit: 03.04.2011
Beiträge: 89
PHP-Kenntnisse:
Anfänger
Anima ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von php.de Beitrag anzeigen
Allerdings frage ich mich, ob das wirklich nötig ist. Muss man bei komplexen Zahlen unbedingt derartige Vergleiche anstellen?
Naja, ich wollte halt Ausgaben wie "2 + 1i" vermeiden, weil 1 * i ja nichts anderes als i ist. Deswegen wollte ich halt überprüfen, ob der Imaginärteil 1 ist.

Danke, ich werde mir mal BC Math anschauen.
Anima ist offline   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
php / mysql Probleme bei Umstieg von php 5.2 auf 5.3 Gerhard76 PHP Einsteiger 10 21.09.2011 12:58
$_SESSION Probleme Thomasd82hb PHP Tipps 2010 12 12.06.2010 01:34
[Erledigt] fopen() Probleme jN^ PHP Tipps 2009 2 18.08.2009 12:31
[Erledigt] Firefox / IE - Probleme HTML, Usability und Barrierefreiheit 5 20.07.2009 17:04
Win+Firefox alles ok, IE oder Linux: Probleme vollderdude PHP Tipps 2009 6 02.01.2009 16:17
[Erledigt] Probleme mit iFrame rocco HTML, Usability und Barrierefreiheit 1 28.12.2008 17:44
Probleme bei Speicherung von serialize() Strings Manni2k PHP Tipps 2006 13 15.10.2006 15:06
Probleme mit mbstring extension unter Debian HStev Server, Hosting und Workstations 3 30.08.2006 20:55
Probleme mit Rechteverteilung chmod() per script!!!??? Funky_ PHP Tipps 2006 7 17.06.2006 17:10
Probleme mit Sonderzeichen... Datenbanken 1 02.08.2005 23:37
[Erledigt] hilfe! probleme mit... PHP Tipps 2005 4 12.04.2005 22:55
[Erledigt] CSV Größe macht Probleme mit php PHP Tipps 2005 5 15.03.2005 21:29
Zwei Rechner ins Netz - Router - Hub - Probleme... imported_Ben Off-Topic Diskussionen 37 13.01.2005 21:36
[Erledigt] Technische Probleme mit Sessions PHP-Fortgeschrittene 4 18.11.2004 14:45
[Erledigt] Probleme mit Fremdsprachen HTML, Usability und Barrierefreiheit 2 21.09.2004 17:11

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
zahlenprüfung php

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:39 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