Mantissenbits berechnen!



  • SeppJ schrieb:

    Deine Bemerkung zu den Registern verstehe ich zum Beispiel gar nicht.

    Es geht ihm wohl darum, dass die Werte in der Schleife nicht durchgängig in Registern liegen (und dann den "Gesetzen" der internen Darstellung der FPU (iirc 80Bit Register) unterworfen sind), sondern immer wieder auf 32Bit-float "gekürzt" werden. Den Algorithmus verstehe ich auch nicht.

    SeppJ schrieb:

    Tim schrieb:

    Oder hab ich was falsch verstanden?

    Ups, die habe ich übersehen, dabei habe ich die float.h garantiert 3x durchgelesen weil ich nicht glauben konnte, dass es das nicht gibt. Ist natürlich wesentlich besser als meine spekulative Rechenlösung 👍

    Sollte eigentlich auch in der fenv.h liegen 😉 edit: kann gut sein, dass die erst ab C99 dabei ist.


  • Mod

    Tim schrieb:

    SeppJ schrieb:

    Deine Bemerkung zu den Registern verstehe ich zum Beispiel gar nicht.

    Es geht ihm wohl darum, dass die Werte in der Schleife nicht durchgängig in Registern liegen (und dann den "Gesetzen" der internen Darstellung der FPU (iirc 80Bit Register) unterworfen sind), sondern immer wieder auf 32Bit-float "gekürzt" werden. Den Algorithmus verstehe ich auch nicht.

    Ahh, so etwas ähnliches dachte ich mir schon. Hätte aber nicht gedacht, dass siech dies tatsächlich auf vergleiche auswirkt.

    Sollte eigentlich auch in der fenv.h liegen 😉 edit: kann gut sein, dass die erst ab C99 dabei ist.

    Nein, sind in der float.h, beide sind C89. Hatte ich bloß überlesen, weil ich beim Überfliegen immer nach dem Wort "Bits" gesucht habe, nicht nach "Digits".



  • Die Aufgabe lautet:

    "(...) die Genauigkeit (Anzahl der Mantissenbits) von float Zahlen bestimmen (...) Halbieren Sie dazu sukzessive eine Ausgangszahl (z.B. 1) und testen Sie, ob die Summe aus Zahl und Ausgangszahl sich von der Ausgangszahl unterscheidet. (...)"

    somit ist mein algorithmus richtig. beide codes liefern das gleiche ergebnis. mein problem ist nur, das das erste Beispiel von einem bekannten stammt, der darauf die volle punktzahl bekommen hat, und mein beispiel (das 2.) abzug bekamm.... diese bewertung wollt ich gern mal nachvollziehen können. 🙂
    ...fand meine variante eigentlich sehr günstig.



  • Beide Varianten sind identisch. Ich hoffe du hast im zweiten float_temp nicht stehen gehabt, weil sonst hättest du eine ungenutzte Variable und somit einen gerechtfertigten Punktabzug.



  • Also ich finde die nicht-initialisierte aber benutzte Variable schlimmer als die unbenutze 😉



  • Tim schrieb:

    Also ich finde die nicht-initialisierte aber benutzte Variable schlimmer als die unbenutze 😉

    Wenn er sie nicht benutzt, warum hat er sie dann? Wohingegen man der ersten Variante nur vorwerfen könnte, sie nicht weiter vereinfacht zu haben. Aber eine nicht verwendete Variable ist ein "nogo" 😛



  • HighLigerBiMBam schrieb:

    Beide Varianten sind identisch. Ich hoffe du hast im zweiten float_temp nicht stehen gehabt, weil sonst hättest du eine ungenutzte Variable und somit einen gerechtfertigten Punktabzug.

    float_temp steht da natürlich nicht...hab das falsch kopiert....

    die bewertung erfolgte mit der begründung, das die berechnung ausschließlich im register statt findet?!?! aber wie gesagt, bin auch der meinung das das identisch zu dem anderen ist 😞



  • HighLigerBiMBam schrieb:

    Tim schrieb:

    Also ich finde die nicht-initialisierte aber benutzte Variable schlimmer als die unbenutze 😉

    Wenn er sie nicht benutzt, warum hat er sie dann? Wohingegen man der ersten Variante nur vorwerfen könnte, sie nicht weiter vereinfacht zu haben. Aber eine nicht verwendete Variable ist ein "nogo" 😛

    ..ist im original auch alles richtig initialisiert 😉



  • Man erhält schlechte Wertungen, wenn man Speicher spart... 👍

    Ganz im ernst das kann ich nicht nachvollziehen. Ich hätte deiner mehr Punkte gegeben als der mit der temp-variablen.

    Ich vermute sogar, dass der compiler bei beiden den gleichen Code erstellt. Schau mal ob du über Assembler beweis die volle Punktzahl erhälst.



  • wie kann ich das am besten machen?



  • SteVO schrieb:

    wie kann ich das am besten machen?

    erstelle Programme mit beiden Versionen und schaue dir z.b. mit Olly-Debug den Assemblercode an.

    Edit: Du kannst dir das auch sparen, denn die Code sind identisch. Mein Compiler warnt nur vor der uninitialisierten Variablen aus der Variante 1. wonach deine weiterhin besser ist als die angeblich 100% Punkzahlvariante. man dein prof/Lehrer ist bekifft!



  • Es würde mich wundern, wenn der Code exakt der Gleiche wäre, die Ausgabe ist jedenfalls nicht identisch...
    Oder habe ich mich irgendwo verguckt?



  • ok, Ich habe dem Fehler...

    habe es auf meinem 64 bit osx geschrieben und ausgeführt...auf 64 bit läuft mein variante fehlerfrei, führt man sie hingegen auf einem 32 bit system aus, kommen die fehler...

    auf einem 32 bit System ist es notwendig das ergebnis zwischen zu speichern, da sonst nur in long double gerechnet wird... folglich kommt immer 64 für die anzahl der mantissenbits heraus!

    😞


Anmelden zum Antworten