double Zahl Periode auflösen



  • Garnicht. Fließkommazahlen haben auf dem Rechner nur eine begrenzte Genauigkeit, das heißt unter Anderem, dass es gar keine periodischen Zahlen gibt.
    Dein Beispiel macht so auch keinen rechten Sinn: die beiden neuner am Ende deuten an, dass danach die Zahl zu Ende ist (und damit nicht periodisch), die Punkte deuten an, dass es endlos (periodisch) so weiter geht, so dass man aber nie zu den beiden Neunern am Ende kommt. Was darfs denn nun sein?



  • Floatingpoint-Zahlen sind intern binär dargestellt mit Mantisse und Exponent. Dezimale Perioden x.xxx9999 sind nicht ohne weiteres erkennbar. Du brauchst eine dezimale Rundung mit vorgegebener Anzahl Nachkommastellen. Entweder bietet dein Compiler das oder du lädst von meiner Homepage http://berniebutt.npage.de die Funktion round herunter.

    Oder du benutzt ganz einfach die Streammanipulatoren setw und setprecision. Die tun das für dein Beispiel auch.



  • Das Problem taucht auf wenn ich genau, diese double Zahl vergrößere, und dadurch hat sie einen anderen Wert. Mir ist es schon bewusst, dass die Double Zahlen in ihrer Mantisse nur eine gewisse Größe haben können, aber das löst nicht das Problem.

    Gibt es eine Möglichkeit Perioden zu erkennen?



  • Beobachter01 schrieb:

    Gibt es eine Möglichkeit Perioden zu erkennen?

    Ja. Aber auch nur, wenn Du Dich auf eine Ausgabegenauigkeit beschränkst.
    So, wie jeder anständige Taschenrechner, der innen zwei mehr Stellen rechnet, als er anzeigt. Täte er das nicht tun, würde er auch dauernd 99999999 oder 0000001 am Ende haben.
    Dein Problem ist, daß Du die Stellenanzahl der Ausgabe übertreibst. Sonst nichts.



  • @volkrad
    Da hast du Recht, ich muss mich auf eine Ausgabegenauigkeit beschränken. Mit setprecision kann ich es anschließend umsetzten.

    Danke euch allen. Grüße



  • Nochmals eine Frage,

    Die Ausgabe funktioniert zwar mit cout aber kann ich es auch per stringstream zwischenspeichern und wieder einer double zuweisen. setprecision funktioniert hier nicht Ordnungsgemäß.



  • Beobachter01 schrieb:

    Nochmals eine Frage,

    Die Ausgabe funktioniert zwar mit cout aber kann ich es auch per stringstream zwischenspeichern und wieder einer double zuweisen. setprecision funktioniert hier nicht Ordnungsgemäß.

    Haste die Endausgabe des doubles wieder unbeschränkt?
    Bedenke, daß nichtmal einfache Zahlen wie 0.1 glatt in einen double passen, weil der im Zweiersystem speichert. Im Zehnersystem ist 0.1 glatt, nur hat der Rechner keine Ahnung davon, für den ist 1/10 so eklig wie für uns 1/7.



  • Ist das immer wieder so schwer? 😕 fload und double sind binär - also im Zweiersystem. Der dezimale Wert 0.1 ist binär nicht exakt darstellbar. Der Manipulator setprecision dient nur zur verständlichen Darstellung im Dezimalsystem, an der internen Speicherung ändert sich nichts! Das uns geläufige Dezimalsystem ist ebenfalls willkürlich, weil Menschen an zwei Händen zehn Finger haben. Der Oktopus würde oktal mit 8 rechnen und hätte mit Computern weniger Verständnisschwierigkeiten, weil 8 eine Potenz von 2 ist.



  • Beobachter01 schrieb:

    Die Ausgabe funktioniert zwar mit cout aber kann ich es auch per stringstream zwischenspeichern und wieder einer double zuweisen. setprecision funktioniert hier nicht Ordnungsgemäß.

    cout und stringstream sind beides std::ostream - daran liegt es nicht. Wahrscheinlich wurde std::fixed vergessen. Erst mit dieser Einstellung rundet die Ausgabe im ostream auf n Nachkommastellen; ohne fixed nur auf n Stellen.

    double d = 12.23499999;
        cout << fixed << setprecision(5) << endl; // 12.23500
    


  • Ich setze da standardmässig einmal fixed, floatfield, und showpoínt - und denke nicht weiter nach. Die IO-Stream-Klassen machen das gewünschte.


Anmelden zum Antworten