komplexe Zahlen



  • Hallo!
    Ich will in "reinem" C (warum ich im C++Forum poste, verrate ich noch) eine Fraktalberechnung der Julia-Menge inklusive grafischer Darstellung programmiern. Da ich dafür komplexe Zahlen benötige, habe ich mir einen eigenen Datentyp geschrieben:

    typedef struct
    {
      float flReal;
      float flImag;
    } complex_t;
    

    Also dasselbe wie _complex aus math.h/cmath, nur mit einer sinnvollen Variablenbenennung. (Da ich mal wieder was in C schreiben weill, fällt std::complex<float> ja weg)
    Die Struktur für Rechen- und Zeicheninformationen sieht wie folgt aus:

    typedef struct
    {
      complex_t z;
      complex_t c;
      // std::complex<float> z;
      // std::complex<float> c;
      unsigned char *pData;
    } julia_t;
    

    Das Problem: Meine komplexen Zahlen funktionierem aus irgendeinem Grund nicht so, wie sie sollten, deshalb habe ich Testhalber in julia_t auch sämtliche 'complex_t' mit std::complex<float> ersetzt und die Berechnungen ggf. mit Operatoren ausgetauscht - siehe da, es funktioniert. Warum aber will der von mir geschriebene Typ complex_t nicht funktionieren?
    Hier der entscheidende Teil, bei dem mit komplexer Arithmetik gearbeitet wird:

    // mit std::complex<float> - funktioniert:
    j.z *= j.z;
    j.z += j.c;
    
    // mit complex_t - funktioniert nicht:
    j.z.flReal *= j.z.flReal;
    j.z.flImag *= j.z.flImag;
    j.z.flReal += j.c.flReal;
    

    Eigentlich ist der mit complex_t geschriebene Code ja nur der Code von operator*= und operator+= von std::complex, aber trotzdem funktioniert es nicht. Warum?

    Danke im Voraus, aVoX.



  • #include <complex.h>
    

    Ansonsten: c^2 = (a + bi)^2 = a^2 - b^2 + 2abi

    trotzdem funktioniert es nicht.

    Das ist keine Fehlerbeschreibung. Hast du denn mal die Werte bei einer einfachen Multiplikation verglichen, also bei z = c^2 + a konkrete Werte eingesetzt?

    Eigentlich ist der mit complex_t geschriebene Code ja nur der Code von operator*= und operator+= von std::complex

    Woher nimmst du diese Gewissheit? Hast du in der STL nachgesehen?



  • aVoX schrieb:

    // mit std::complex<float> - funktioniert: 
    j.z *= j.z; 
    
    // mit complex_t - funktioniert nicht: 
    j.z.flReal *= j.z.flReal; 
    j.z.flImag *= j.z.flImag;
    

    Das Produkt komplexer Zahlen entsteht nicht durch separate Multiplikation von Real- und Imaginärteil.

    Tipp: a * b == (a.real + i*a.imag) * (b.real + i*b.imag)

    knivil schrieb:

    #include <complex.h>
    

    Nein, der Header heisst <complex> . C++-Standardheader haben nie eine Dateiendung.



  • Nexus schrieb:

    Tipp: a * b == (a.real + i*a.imag) * (b.real + i*b.imag)

    *Facepalm* Meine Mathematikkenntnisse grenzen wirklich schon fast an moderne Kunst. Danke 🙂



  • Nexus schrieb:

    Nein, der Header heisst <complex>. C++-Standardheader haben nie eine Dateiendung.

    Mann, Mann, Mann, Frau ... Generation Pisa? Der erste SATZ:

    Ich will in "reinem" C (warum ich im C++Forum poste, verrate ich noch)



  • aVoX schrieb:

    Ich will in "reinem" C (warum ich im C++Forum poste, verrate ich noch)

    Wann verrätst du uns das? Hoffentlich bald, sonst seh ich keinen Grund, das nicht ins C-Forum zu verschieben 😉


Anmelden zum Antworten