Problem mit der Ausgabe



  • Hallo,

    //#include<fstream>
    #include<cmath>
    main(int argc, char*argv[]){
    	//std::ofstream Ausgabe;
    	double Ergebnis{2ll};
    	while(pow(Ergebnis,3)-2>0.00000000001&&pow(Ergebnis,3)-2>-0,00000000001)pow(Ergebnis,3)>2?Ergebnis/=2:Ergebnis=(Ergebnis+Ergebnis/2);
    	std::cout<<Ergebnis<<std::isnormal(Ergebnis);
    	//Ausgabe<< Ergebnis;
    }
    

    dieser Code gibt einfach nichts aus! Eigentlich wollte ich ihn in eine Datei umleiten können(oder dem Ausführer die Wahl lassen). Da ich gerade noch nicht weiß, wie man so etwas macht, hab ich ihn dann getestet mit der Konsolenausgabe. Das Ergebnis: Wenn ich vor der Weilschleife irgendwas ausgeben lasse in die Konsole, wuppt das reibungslos, nach der Weilschleife geht nicht mal mehr abc. Das Programm ist wohl durch den Compiler durch und wird in allen Fällen ausgeführt. Mir ist jetzt nicht bekannt das eine Berechnung die Konsole sprengt. Die Ausgabe für die Datei hab ich dann in Klammern gesetzt, falls sich die Ausgaben widersprechen, was meine ich nicht sein kann, aber sicher ist sicher.



  • -0,00000000001

    Komma statt Dezimalpunkt?

    PS: Der Compiler sagt es dir auch (wenn du noch #include <iostream> hinzufügst und main durch int main ersetzt)

    clang++-10 -Wall -Wextra forum.cpp
    forum.cpp:5:39: warning: expression result unused [-Wunused-value]
            while(pow(Ergebnis,3)-2>0.00000000001&&pow(Ergebnis,3)-2>-0,00000000001)pow(Ergebnis,3)>2?Ergebnis/=2:Ergebnis=(Ergebnis+Ergebnis/2);
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ ~~~~~~~~~~~~~~~~~~~~
    

    Generell: warum alles in einer Zeile, wer soll das lesen?



  • @Ichwerdennsonst sagte in Problem mit der Ausgabe:

    dieser Code gibt einfach nichts aus!

    Da er gar nicht übersetzt wird, ist das auch kein Wunder.



  • Oh das ist blöd, aber was interpretiert der Compiler denn mit einem Komma in der Weilschleife?? Warum kann ich das Programm ausführen aber ohne Ausgabe?



  • @Ichwerdennsonst sagte in Problem mit der Ausgabe:

    aber was interpretiert der Compiler denn mit einem Komma in der Weilschleife??

    while(true)



  • @Ichwerdennsonst sagte in Problem mit der Ausgabe:

    Oh das ist blöd, aber was interpretiert der Compiler denn mit einem Komma in der Weilschleife?? Warum kann ich das Programm ausführen aber ohne Ausgabe?

    Siehe https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator

    Im Endeffekt führst du den Teil vor dem Komma aus und scheißt das Ergebnis weg und verwendest dann den Teil hinter dem Komma. Und hinter dem Komma steht 00000000001. Das ist das gleiche wie 1. Also while(1). Hättest du die 0,00000000001 in eine Konstante oder Variable gelegt und damit benannt, wäre das gleich viel lesbarer.

    Also sowas wie double epsilon = 0.00000000001; Damit wäre das Problem auch nicht aufgetreten - denn einmal hast du die Zahl ja korrekt geschrieben. Und wenn du Compiler-Warnungen anstellst, dann sagt dir der Compiler doch sogar, dass der geamte unterstrichene Teil, also pow(Ergebnis,3)-2>0.00000000001&&pow(Ergebnis,3)-2>-0, eine unbenutzte Expression ist. Lies Warnungen! Behebe alle Warnungen!

    PS: Ein Sourcecode-Formatierer wie clang-format hätte wahrscheinlich auch geholfen, hinter jedes Komma gehört ein Leerzeichen. Dann fällt auch sofort auf, dass da nicht 0.00000000001 steht, sondern 0, 00000000001. Oder scheib doch einfach 1e-11, dann braucht man die Nullen nicht zu zählen.



  • @wob sagte in Problem mit der Ausgabe:

    ...
    Im Endeffekt führst du den Teil vor dem Komma aus und scheißt das Ergebnis weg und verwendest dann den Teil hinter
    ...

    MMD!



  • @DocShoe War unabsichtlich. Ich lasse es aber mal so stehen, passt ja auch so ohne m 🙂



  • Schon gut. Ich fand nur eine Konstante wäre ein bisschen überflüssig, besonders wo Double so ungenau ist. Aber läuft jetzt



  • @Ichwerdennsonst sagte in Problem mit der Ausgabe:

    Ich fand nur eine Konstante wäre ein bisschen überflüssig, besonders wo Double so ungenau ist.

    Hä? Wo ist der Zusammenhang?



  • @wob sagte in Problem mit der Ausgabe:

    Hä? Wo ist der Zusammenhang?

    Ich müsste mit dem Ding mindestens einmal rechnen und das könnte die Genauigkeit überschritten haben;Sprich 1.+0.00000000001 ist vielleicht schon etwas anderes als es mathematisch gesund ist. Dann lass ich lieber richtig abprüfen.



  • @Ichwerdennsonst
    Es mach genau keinen Unterschied ob du

    while(pow(Ergebnis,3)-2 > 0.00000000001)
    

    schreibst, oder

    constexpr double eps = 0.00000000001;
    while(pow(Ergebnis,3)-2 > eps)
    

Log in to reply