[Anfänger] Wie rechne ich mit PI? Ich habe keine Nachkommastellen!



  • Hallo,
    Ich versuche mich gerade mit hilfe des Internets in C++ einzuarbeiten. Ich bin bereits auf verschiedene Tutorials gestoßen. Allerdings habe ich öfter Probleme auf die in den Tutorials gar nicht genauer eingegangen wird.

    Problem:
    Ich möchte Testweise PI mit irgendeinen Wert multiplizieren. Allerdings gibt mir mein Programm keine Kommastellen aus. Des weiteren wird immer nur aufgerundet. 😕

    Als Beispiel:
    Multipliziere ich 3.14159265358932 * 5, gibt mir mein Programm als Ergebniss 15 aus, das kann definitiv nicht stimmen.
    http://i.epvpimg.com/U53Kfab.jpg

    Lösungsversuche:
    long, double long, float, const float, 0.0314159265358932 * 10

    Aktueller Code:

    #include <iostream>
    using namespace std;
    
    int main() 
    {
    	int a,rechnung;
    	cout << "Bitte geben sie jetzt einen Wert ein der mit PI multipliziert wird:" << endl;
    	cin >> a;
    	double long PI = 3.14159265358932;
    	a = rechnung = a * PI;
    	cout << rechnung << endl;
    	return 0;
    }
    

    Meine Arbeitsumgebung:
    Notepad++ Portable in Kombination mit MinGW Portable. Den g++ Compiler starte ich mit einer BAT Datei.

    @echo off
    cd C:\Portable\MinGWPortable\bin
    START /WAIT g++ -o C:\Users\XY\Desktop\compiled.exe C:\Users\XY\Desktop\source.cpp
    echo Das Programm wurde erstellt:
    echo.
    echo.
    cd C:\Users\XY\Desktop
    compiled
    echo.
    echo.
    ping 127.0.0.1 -n 11 > nul
    


  • Die Variable rechnung hat den Typ int , sollte aber double haben (sonst wird das double -Resultant zu int konvertiert).



  • Danke für deine schnelle Antwort, nun funktioniert das Rechnen mit Nachkommastellen. Nun frage ich mich, wie ich mit C++, präzise berechnungen anstellen kann. Denn auch hier wird mein Ergebniss nach der dritten Nachkommestelle aufgerundet.

    Könnt ihr mir vielleicht gute Tutorials, Lernseiten oder gar Lernprogramme empfehlen? Bevorzugt in deutscher Sprache, englisch wäre aber auch zu verkraften.

    Gruß
    Tommy_Nightmare



  • Tommy_Nightmare schrieb:

    Des weiteren wird immer nur aufgerundet. 😕

    Du meinst wohl "abgerundet".

    Die Lösung kam ja schon. Um solche Probleme zu vermeiden, würde ich nicht prophylaktisch alle Variablen oben deklarieren, sondern erst da, wo du sie brauchst. Dann wäre das vielleicht einfacher zu sehen.

    Also nicht:

    int rechnung;
    // viel Code, hier hat rechnung noch undefinierten Wert
    // ...
    // noch weiter unten:
    rechnung = a * PI;
    

    Sondern die Variable erst bekanntmachen, wenn du den Wert schon kennst:

    int rechnung = a * PI;
    

    Dann fällt dir vielleicht schneller auf, dass hier was komisch ist, denn rechnung ist "int", also eine Ganzzahl.

    Um immer den passenden Typen zu verwenden, kannst du auto verwenden:

    auto rechnung = a * PI;
    

    Natürlich geht auch explizit "double". Der Punkt ist nur, dass man bei auto sicher ist, dass hier keine Konvertierung durchgeführt wird.

    Und als letzten Kommentar:

    a = rechnung = a * PI;
    

    Was soll hier das "a = " am Anfang?



  • Tommy_Nightmare schrieb:

    Danke für deine schnelle Antwort, nun funktioniert das Rechnen mit Nachkommastellen. Nun frage ich mich, wie ich mit C++, präzise berechnungen anstellen kann. Denn auch hier wird mein Ergebniss nach der dritten Nachkommestelle aufgerundet.

    Präzise und Floatingpoint ist ein Widerspruch in sich :-), das hatten wir doch gerade erst, siehe SeppJs Erklärung hier: https://www.c-plusplus.net/forum/343971 oder https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

    C++ bzw. doubles sind schon genauer als das, was du siehst. Deine Ausgabe wurde allerdings gerundet. doubles haben über den Daumen so <~ 17 Stellen Genauigkeit. Nutze z.B. setprecision:

    cout << setprecision(20) << 1.0000000001 << '\n';
    

    Wenn du es genauer brauchst, schau dir mal sowas Bibliotheken wie gmp an.



  • Tommy_Nightmare schrieb:

    Könnt ihr mir vielleicht gute Tutorials, Lernseiten oder gar Lernprogramme empfehlen? Bevorzugt in deutscher Sprache, englisch wäre aber auch zu verkraften.

    Schau dir die mit "Wichtig" markierten Threads an.



  • Noch ein Tipp: lass PI durch Dein System festlegen.

    #include <cmath>  // wg std::acos
    
    namespace
    {
        auto const PI = std::acos(-1.0);
    }
    

    Dann kannst Du sicher sein, dass der Wert die maximale Genauigkeit hat, die Deine Umgebung bietet.


Anmelden zum Antworten