Complexe Zahlen?



  • Hi,

    Ich habe mich gefragt, wie man denn in C complexe Zahlen definiert ?
    Es sollte doch eigentlich so einfach sein:

    #include <complex.h>
    #include <stdio.h>
    
    int main () {
    
    ...
    
    double complex z1 = 1+2*I;
    ...
    
    return 0;
    
    }
    

    Bei mir funktioniert dies aber nicht.
    Fehlermeldung -> z1 wird unterstrichen: "Es wurde ein ';' erwartet"

    Ich benutze Visual Studio Professional.

    Wäre dankbar für einen kleinen Tipp 🙂

    mfg



  • Es sollte doch eigentlich so einfach sein:

    Nein sollte es nicht - und wie kommst du darauf?

    nimm das hier
    http://en.cppreference.com/w/cpp/numeric/complex



  • Gast3 schrieb:

    Es sollte doch eigentlich so einfach sein:

    Nein sollte es nicht - und wie kommst du darauf?

    nimm das hier
    http://en.cppreference.com/w/cpp/numeric/complex

    Das ist C++ , nicht C.

    In C sollte es so gehen, wie ich es oben geschrieben habe (seit C99).
    Die Syntax habe ich übrigens auch von der selben Seite (nur unter C eben) und in meinem C-Buch steht die Syntax genauso.
    Ich weiß nicht weiter 😞



  • Microsofts C Compiler kann aber kein C99. Versuch _Dcomplex .



  • Ok, mit _Dcomplex kann ich zumindest schonmal deklarieren:

    _Dcomplex z1;
    

    Und wie Definiere ich nun explizit eine komplexe Zahl?

    _Dcomplex z1 = 2.0 + 3.0*I;
    

    geht immer noch nicht.
    "Kein "*"-Operator stimmt mit diesen Operanden überein. Operandentypen sind: double * _Fcomplex "

    Seltsam.. wieso soll der Compiler das nicht können? Aber mit C11 gibt es doch sowieso noch weitere Makros für komplexe Zahlen.
    Also irgendwie muss das doch gehen? 😕 😕


  • Mod



  • Ja, auf dieser Seite steht es genauso, wie ich es auch definiert habe. Geht leider nicht.


  • Mod

    Ups, Microsoft Compiler. 'Tschuldigung, dann war meine Bemerkung unangemessen. Dummerweise finde ich selber keine Dokumentation zu _Dcomplex.

    Ideen:
    -Es wird sicherlich irgendein Makros oder Buildin dafür geben. Etwas in der Richtung von _DI oder _D_Imaginary_I. Vielleicht kommt man durch Ausprobieren drauf. Oder man findet es im complex.h Header.

    • const _Dcomplex I = csqrt(-1); 😃
      -Vielleicht ist es eine Option, diesen Programmteil einfach mit dem C++-Compiler zu übersetzen. Das sollte nicht zu viele Änderungen nötig machen, da C++ auch große Teile von C beinhaltet. Hauptsächlich wird man eventuell an ein paar Stellen ein paar Casts machen müssen, um das strengere C++-Typsystem zufrieden zu stellen. Dafür hat man dann einen recht intuitiv benutzbaren Datentyp für komplexe Zahlen zur Verfügung.
      -Zu guter Letzt ist es natürlich immer eine Option, es einfach selber zu machen oder eine Bibliothek dafür zu nutzen. Leider hat man dann in C nicht die schicke Schreibweise mit den Operatoren +, -, * und so weiter zur Verfügung. Dann wird das eben leider zu so etwas wie
    struct Complex I = {0,-1};
    struct Complex foo = {1, 1};
    struct Complex bar = complex_add(I, foo);
    


  • SeppJ schrieb:

    -Vielleicht ist es eine Option, diesen Programmteil einfach mit dem C++-Compiler zu übersetzen. Das sollte nicht zu viele Änderungen nötig machen, da C++ auch große Teile von C beinhaltet. Hauptsächlich wird man eventuell an ein paar Stellen ein paar Casts machen müssen, um das strengere C++-Typsystem zufrieden zu stellen. Dafür hat man dann einen recht intuitiv benutzbaren Datentyp für komplexe Zahlen zur Verfügung.

    Vor dieser Option würde ich selber schreiben vorschlagen. Viel langsamer als in C++ kann man complex nicht programmieren und hat dafür keine Riesendependency auf dem Hals.



  • Also geht das mit dem Microsoft Compiler gar nicht? Wieso das denn? Ist ja blöd 😞
    Mit welchem würde es denn z.B. gehen?
    Btw: ich kann gar nicht explizit wählen zwischen C oder C++ Compiler (Visual Studio 2013 Professional).

    mfg



  • SeppJ schrieb:

    csqrt(-1);

    Waas??? csqrt ist nicht stetig? Das geht ja gar nicht!



  • Blackroya schrieb:

    Also geht das mit dem Microsoft Compiler gar nicht?

    dub di dub.

    Blackroya schrieb:

    Wieso das denn? Ist ja blöd 😞

    ommmmm?

    Blackroya schrieb:

    Mit welchem würde es denn z.B. gehen?

    dadi bi dap.

    Blackroya schrieb:

    Btw: ich kann gar nicht explizit wählen zwischen C oder C++ Compiler (Visual Studio 2013 Professional).

    Doch, kannst schon: Project Properties -> Configuration Properties -> C/C++ -> Advanced -> Compile as: Compile as C Code (/TC)


  • Mod

    option schrieb:

    SeppJ schrieb:

    -Vielleicht ist es eine Option, diesen Programmteil einfach mit dem C++-Compiler zu übersetzen. Das sollte nicht zu viele Änderungen nötig machen, da C++ auch große Teile von C beinhaltet. Hauptsächlich wird man eventuell an ein paar Stellen ein paar Casts machen müssen, um das strengere C++-Typsystem zufrieden zu stellen. Dafür hat man dann einen recht intuitiv benutzbaren Datentyp für komplexe Zahlen zur Verfügung.

    Vor dieser Option würde ich selber schreiben vorschlagen. Viel langsamer als in C++ kann man complex nicht programmieren und hat dafür keine Riesendependency auf dem Hals.

    Und die eingebauten komplexen Zahlen in C99 sind anders? Die sind doch praktisch von C++ übernommen. Und beide sind praktisch identisch mit den komplexen Zahlen sämtlicher etablierter Mathebibliotheken.

    Das Argument mit der Abhängigkeit von der C++-Runtime ist aber (semi-)richtig. Aber hat man überhaupt die Wahl, wenn man den Microsoft-Compiler nutzt? So stiefmütterlich wie MS C behandelt, hätte ich erwartet, dass man in jedem Fall die volle MSVC++-Runtime als Abhängigkeit hat. Da ich das Ding nicht nutze, kann ich es aber nicht nachprüfen. So lange man aber nur die Grundrechenarten nutzt, sollte in beiden Fällen aber ohnehin keine Abhängigkeit bestehen. Bei C sind sie eingebaut. Bei C++ sind alles Templates.

    Blackroya schrieb:

    Also geht das mit dem Microsoft Compiler gar nicht? Wieso das denn? Ist ja blöd 😞

    Weil Microsoft C nicht wirklich unterstützt und dort technisch auf dem Stand von 1989 stehen geblieben ist.

    Mit welchem würde es denn z.B. gehen?

    Mit allen anderen etablierten Compilern.

    Btw: ich kann gar nicht explizit wählen zwischen C oder C++ Compiler (Visual Studio 2013 Professional).

    Doch, irgendwo ist das möglich. Im Zweifelsfall kannst du es implizit über die Dateiendung machen: .c für C, .cpp für C++.

    Swordfish schrieb:

    Blackroya schrieb:

    Also geht das mit dem Microsoft Compiler gar nicht?

    dub di dub.

    Bloß ist diese angabe offenbar falsch. Blackroya ist anscheinend nicht die einzige Person mit diesem Problem, wie eine Suche bei Stackoverflow offenbart. Oder genauer: Die Liste der implementierten Funktionen mag stimmen, aber den Datentyp an sich haben sie nicht zur Verfügung gestellt! Zumindest nicht auf die Art und Weise, wie C99 es verlangt.



  • Thaaa. Hab ich das nicht gesagt:

    Swordfish schrieb:

    Microsofts C Compiler kann aber kein C99. Versuch _Dcomplex.


  • Mod

    Swordfish schrieb:

    Thaaa. Hab ich das nicht gesagt:

    Swordfish schrieb:

    Microsofts C Compiler kann aber kein C99. Versuch _Dcomplex.

    Ja, aber die berechtigte Frage, die danach aufkam, war, ob es eine vordefinierte Konstante für das imaginäre Element gibt und wie diese heißt. I, wie im C99-Standard, ist es offenbar nicht.



  • Oh. In dem Fall: Es ist I synonym mit _Complex_I .

    // der Typ stimmt natürlich nicht, Weil mit VS2013 nur an den C89-Compiler angeflanscht wurde.


Log in to reply