Maschinengenauigkeit



  • Hallo,

    Maschinengenauigkeit ist doch eigentlich das falsche Wort. DAtentypgenauigkeit wäre doch besser.

    Es hängt einfach davon ab ob ich float oder double nehme. Bei double ist die Maschinengenauigkeit höher .



  • string::const_iterator it;
    for(it = message.begin(); it != message.end(); ++it)
        if(*it == '?')
            break;
    if(it == message.end())
        throw std::forum_exception("No question found.");
    

  • Mod

    Deine Weltsicht ist zu eingeschränkt. single precision und double precision sind zwei bestimmte Genauigkeitsstufen in einem bestimmten Verfahren zur Darstellung von Fließkommazahlen. Diese Begriffe sind dir deshalb so vertraut (und für dich anscheinend die einzige Art und Weise über Fließkommazahlen zu denken), weil diese Form von Fließkommazahlen sich historisch durchgesetzt hat und nun bei praktisch jedem Computer in der Hardware verbaut ist.

    Hast du übrigens schon einmal probiert, die Maschinengenauigkeit eines 8087-Coprozessors (d.h. der traditionellen Fließkommaeinheit (nicht SSE) eines x86) zu messen? Du wirst überrascht sein.



  • SeppJ schrieb:

    Hast du übrigens schon einmal probiert, die Maschinengenauigkeit eines 8087-Coprozessors (d.h. der traditionellen Fließkommaeinheit (nicht SSE) eines x86) zu messen? Du wirst überrascht sein.

    42?



  • klar . es gibt außer double und float noch andere Formate. Aber letztendlich ist es doch der Datentyp welcher die Genauigkeit bestimmt und nicht die Maschine ?


  • Mod

    blurry333 schrieb:

    klar . es gibt außer double und float noch andere Formate. Aber letztendlich ist es doch der Datentyp welcher die Genauigkeit bestimmt und nicht die Maschine ?

    1. Wer legt fest, welche Datentypen verfügbar sind?
    2. Hättest du wirklich mal meinen Vorschlag befolgt, dann hättest du festgestellt, dass der x87 intern 80 Bits benutzt, auch wenn der "Datentyp" (eigentlich macht es keinen Sinn auf dieser Ebene noch von Datentypen zu reden) eine geringere Präzision hat.



  • aber die 80 bit kann ich nicht ausschöpfen. Denn es gibt eben den passenden Datentyp nicht .



  • Die Genauigkeit der x86 FPU ist abhängig von dem was im Control-Register eingestellt ist, und im ungünstigsten Fall nur 24 Bit (trotz Verwendung von double).

    http://msdn.microsoft.com/en-us/library/e9b52ceh(v=vs.80).aspx

    blurry333 schrieb:

    aber die 80 bit kann ich nicht ausschöpfen. Denn es gibt eben den passenden Datentyp nicht .

    Ach.
    Viele Compiler unterstützen 80 Bit Floats als long double . Ist das kein Datentyp?



  • ...



  • blurry333 schrieb:

    Maschinengenauigkeit ist doch eigentlich das falsche Wort. DAtentypgenauigkeit wäre doch besser.

    nein, Maschinengenauigkeit ist weitaus besser.

    Es hängt einfach davon ab ob ich float oder double nehme. Bei double ist die Maschinengenauigkeit höher .

    zwei unterschiedliche maschinen werden dir ein anderes ergebnis liefern, trotz desselben datentyps.



  • rapso schrieb:

    zwei unterschiedliche maschinen werden dir ein anderes ergebnis liefern, trotz desselben datentyps.

    Ja, sie werden vielleicht unterschiedliche Ergebnisse liefern, aber möglicherweise mit der gleichen Genauigkeit ( also z.B. mindestens exakt auf 6 Stellen hinter dem Komma )

    Das Konzept einer Fließkommazahl ist ja festgelegt.

    X-Bits für die Mantisse
    Y-Bits für die Basis ( evtl. ein konstanter Wert )
    Z-Bits für den Exponenten

    Ein Bit ist auf jeder Maschine ein Bit. Und wenn die Zahlen X, Y und Z für beide Maschinen konstant sind, dann werden die Zahlen auch identisch abgebildet. Unterschiede können jetzt nur noch auftreten, wenn die Prozessoren Rechenprozesse unterschiedlich abbilden, falls das überhaupt möglich ist.

    PS: Wo ist eigentlich die Frage des TE?

    Oder anders:

    throw std::string( "haeh?" );
    


  • Ein Bit ist auf jeder Maschine ein Bit. Und wenn die Zahlen X, Y und Z für beide Maschinen konstant sind, dann werden die Zahlen auch identisch abgebildet.

    Die CPU kann80-Bit rgister haben, und solange du nur Dinge rechnest, die ohne Stack auskommen, hast du 80 Bit Genauigkeit.



  • It0101 schrieb:

    rapso schrieb:

    zwei unterschiedliche maschinen werden dir ein anderes ergebnis liefern, trotz desselben datentyps.

    Ja, sie werden vielleicht unterschiedliche Ergebnisse liefern, aber möglicherweise mit der gleichen Genauigkeit ( also z.B. mindestens exakt auf 6 Stellen hinter dem Komma )

    und moeglicherweise auch mit einer ganz anderen genauigkeit.

    Das Konzept einer Fließkommazahl ist ja festgelegt.

    X-Bits für die Mantisse
    Y-Bits für die Basis ( evtl. ein konstanter Wert )
    Z-Bits für den Exponenten

    es geht ja auch nicht um das konzept, bei konzepten sind sich sehr viele einig, es kommt dann aber auf die implementierungsdetails an und die sind oft sehr unterschiedlich.

    Ein Bit ist auf jeder Maschine ein Bit. Und wenn die Zahlen X, Y und Z für beide Maschinen konstant sind, dann werden die Zahlen auch identisch abgebildet.

    das ist nur das 'konzept' der zahlenspeicherung, nicht das konzept der internen verarbeitung, denn das ist nicht festgelegt, festgelegt im IEEE754 standard ist lediglich wieviel die ergebnisse vom perfekten ergebnis abweichen duerfen siehe: http://en.wikipedia.org/wiki/Unit_in_the_last_place

    Unterschiede können jetzt nur noch auftreten, wenn die Prozessoren Rechenprozesse unterschiedlich abbilden, falls das überhaupt möglich ist.

    es ist eher andersrum, preozessoren koennen rechenprozesse bei float fast garnicht gleich abbilden. selbst verschiedene cpus von z.b. intel haben unterschiedliche rechenprozesse, ein atom ist eher auf sparsamkeit ausgelegt und iteriert bei einer division ewig, ein i7 hat eine radix-16 divisionseinheit, macht also pro takt 4bits.

    viele operationen bei floats sind heutzutage ueber naehrungen implementiert. bis vor kurzem konnte z.b. keine CPU wirklich dividieren, es liefen bei CISCs microcodes durch die in mehreren durchlaeufen das ergebnis naeherten, bei RISCs ist es noch heute so, dass normaler code durchlaeuft der divisionen approximiert indem z.b. bei AltiVec eine reciproce, dann im loop interpolate+multiplyadd durchgefuehrt wird bis es dir genau genug ist.



  • float kann nur 6 signifikante Dezimlstellen speichern. Aber warum wird auch gerundet ?

    float y = 123456789;  
    
    cout << y;
    
    // Ausgabe 123457
    


  • krümelkacker schrieb:

    Verwechselst du hier vielleicht die Genauigkeit von float mit der Art und Weise, wie floats per Default bei Streams ausgegeben werden?

    volkard schrieb:

    Außerdem zeigst Du damit noch keine Ungenauigkeit von float, sondern eventuell rundet die Ausgabe nur verdammt früh.

    blurry333 schrieb:

    auch bei float x= 1234567 wird gerundet obwohl das binär nur 21 Stellen sind. Das müßte doch genau in die Mantisse passen ???

    blurry333 schrieb:

    Scheinbar rundet nur der Stream, aber der float passt wohl.

    Du solltest vielleicht die Antworten, die du bekommst, demnächst aufmerksamer lesen.



  • Die Ausgabe ist 1.23457 e^008

    und es wird gerundet!!



  • blurry333 schrieb:

    Die Ausgabe ist 1.23457 e^008
    und es wird gerundet!!

    Nach e schreibt man immer ^, das hatte irgendwas mit Mathe zu tun? 🤡
    Außerdem zeigst Du damit noch keine Ungenauigkeit von float, sondern eventuell rundet diue Ausgabe nur verdammt früh.

    double y = 123456789.0;
    cout << y;
    

    Siehste? Auch 1234567e+008.

    Aber

    float y = 123456789.0;
    cout << y-123456000.0;
    

    verrät sich mit 792 statt 789.



  • auch bei float x= 1234567 wird gerundet obwohl das binär nur 21 Stellen sind. Das müßte doch genau in die Mantisse passen ???



  • Fazit:

    Scheinbar rundet nur der Stream, aber der float passt wohl.

    Und ähm es muss e+008 heissen und nicht e^008


  • Mod

    edit: Wenn wir schon so ein schönes Zitat haben, dann zitiere ich es noch einmal, weil es so schön passt:

    krümelkacker schrieb:

    krümelkacker schrieb:

    Verwechselst du hier vielleicht die Genauigkeit von float mit der Art und Weise, wie floats per Default bei Streams ausgegeben werden?

    volkard schrieb:

    Außerdem zeigst Du damit noch keine Ungenauigkeit von float, sondern eventuell rundet die Ausgabe nur verdammt früh.

    blurry333 schrieb:

    auch bei float x= 1234567 wird gerundet obwohl das binär nur 21 Stellen sind. Das müßte doch genau in die Mantisse passen ???

    blurry333 schrieb:

    Scheinbar rundet nur der Stream, aber der float passt wohl.

    Du solltest vielleicht die Antworten, die du bekommst, demnächst aufmerksamer lesen.

    Jetzt also schon dreimal die bisherigen Antworten im Thread zitiert, da sie offensichtlich nicht gelesen wurden 🙄


Anmelden zum Antworten