FPU: (3 / 10) == 0.29999999...



  • Hallo, naja der Titel sagt eigentlich schon alles.

    Mein Code sieht ungefähr folgendermaßen aus:

    finit
    mov RAX, 3
    push RAX
    fild qword ptr [RSP]
    push 0Ah
    fidiv dword ptr [RSP]
    ...
    fst qword ptr [RSP]
    pop RAX
    movd XMM0, RAX
    ...
    ret
    

    Naja, wie gesagt, wo eigentlich exakt 0.3 herauskommen sollte, kommt 0.2999999999...

    Woran liegt das?

    Gruß



  • 0.3 ist als IEEE float/double nicht exakt darstellbar.



  • 🙄

    Naja, immerhin lag es nicht an mir 😃
    Danke!



  • wenn du schon das Ergebnis in XMM0 zurückgibst, kannst du es dort auch gleich berechnen 😉

    .const
    	c1 REAL8 3.0
    	c2 REAL8 10.0
    .code
    movsd xmm0,c1
    divsd xmm0,c2
    

    Was verwendest du den zur Ausgabe? - Mit den CRT Funktionen wie printf() sollte eigentlich auch 0.3 ausgespuckt werden.



  • Nun das ist ja nicht das einzige was ich per FPU mache, von daher...
    Ausgeben tu ich das erstmal garnicht, hab mir den Wert direkt in Visual Studio angesehen.

    BTW:
    fidiv vs. divsd
    Wie sieht´s da geschwindigkeitsmäßig aus ?



  • __username schrieb:

    fidiv vs. divsd

    SSEx ist grundsätzlich schneller, schon allein daher, dass hier kein Register-Stack gemanagt werden muss.



  • Wunderbar, wieder was dazugelernt 😃

    Kann man sich das dann in etwa so vorstellen (von wegen Geschwindigkeit):

    SSE bzw. erweiterter Befehlssatz <- "Standard" CPU Befehlssatz <- FPU

    ?



  • __username schrieb:

    Kann man sich das dann in etwa so vorstellen (von wegen Geschwindigkeit):
    SSE bzw. erweiterter Befehlssatz <- "Standard" CPU Befehlssatz <- FPU
    ?

    Du musst das Gesamtsystem betrachten:
    Es gibt eine Menge von Rechenwerken die parallel arbeiten und Du erzielst den groessten Durchsatz indem alle optimal ausgelastet sind und keins auf das andere warten muss.
    Selbst die Integer-Einheit besteht intern aus parallelen Addier- und Multiplizierwerken (die Verteilung nimmt Dir da aber das CPU-Frontend ab).
    Auf eine Recheneinheit gaenzlich zu verzichten waere Unsinn.



  • Hab ich mir fast gedacht, aber ich kann da auf meiner CPU keine Rechenwerke erkennen, ist irgendwie zu klein 😉
    Nein Spaß bei seite, das heißt also, dass ich möglichst alles parallel nutze?
    Naja, muss mir wohl mal ein Büchlein über aktuelle CPU-Architekturen im allgemeinen besorgen...



  • Studiengang Computersystem hilft da sehr gut dieses jene zu verstehen 😉 Ich spreche aus Erfahrung muss es mir noch bis Mitte März in den Kopf prügeln damit die Prüfung gut wird.

    MfG Marco

    PS: Und die den Standard des IEEE kannst dir einfach mal in der Wiki anschauen, damit es einfach zu verstehen ist wieso die zahlen nicht genauer dargestellt werden können.



  • Ou...Studiengang... nene, da hab ich noch 2 Jahre Schule vor mir 😉

    Habs aber inzwischen "gelöst", danke trotzdem 👍


Anmelden zum Antworten