RND(-29898) - kann mir die basic routine rnd() nicht erklären, könnte jmd helfen bitte?

  • hallo,


    bin in vice, tippe:
    "? rnd(-29898)" + enter
    und bekomme das ergebnis:
    7.32451645e-06


    soweit - so gut - nur erklären kann ich mir nicht komplett;
    durch den vice monitor konnte ich den ablauf der routinen (im groben und ganzen einigermassen) nachvollziehen:


    durch setzen eines breakpoints:
    in zeile 22: * e097 * breakpoint: rnd()
    konnte ich ab e0d3 sehen, wie bytes durch die rnd() routine vertauscht wurden/werden
    und hier ist dann auch mein verständnis am ende :-)
    ich sehe zwar das ausgegebene endergebnis "7.32451645e-06" habe aber keine idee wie das von hier aus (also ab $e0d3) zustande kommen könnte...



    frage 1:
    ich hab noch versucht mir meine zahl 29898 selbst, also von hand in flp umzurechnen (wie es sonst im fac stehen würde):
    Mantisse * 2^Exponent = Zahl
    0,91241455078125 * 2^15 (=32768) = 29898
    29898 / 32768 = 0,91241455078125


    BYTE exponent: $8f
    %10001111 = $8f (15 ist der Exponent, doch bei positiven Exponenten ist Bit 7 im Exponentenbyte gesetzt)


    komme dann aber hier nicht weiter:
    bytes MANTISSE?
    [FRAGE 1] es gibt keine nachkommastellen, also auch keine mantisse, oder?
    [FRAGE 2] und wie kommt es dann zu den einträgen bei zeile 27 - 30 ?


    ich hab mich hier irgendwie total verfranst und mir dreht sich der kopf (cooles gefühl) - wer erklärt mir bitte
    [FRAGE 3] wie ich mit dieser komischen zahl -29898 AB/VON ZEILE 31 zu diesem komischen endergebnis 7.32451645e-06 komme?


    DANKE!
    (vorsicht: sollte der groschen fallen könnte ich unkontrolliert anfangen zu knutschen! :-) )

  • danke alex, aber das kannte ich schon - meine frage geht tiefer, genauer gesagt:
    wie kommt es (in der rnd() routine) von/ab $e0d3 zu dem ausgegebenen endergebnis?

  • Also mir zeigt Vice 2.4 für RND(-29898) 8.87586703E-06


    Ad Frage 1: Es gibt immer enie Mantisse. Als Binärzahl entspricht das eben dem obigen Wert 0,912414.... Das /32768 entspricht ja nur einem Verschieben um 15 Bits. Die Bits der Mantisse als "Bitfolge" bleibt gleich.
    Ad Frage 2: Das ist unmittelbar nach der Vertauschung in der Mantisse, aber vor der Normalisierung. RND funktioniert bei negativem Parameter eben so, dass die Mantisse der Zahl durcheinander gewürfelt wird (die beiden äußeren Bytes und die beiden inneren werden vertauscht) und der Exponent als Rundungsbyte verwendet wird, also als bei der Normalisierung als niederwertige Bits "nachgeschoben" wird. Die Normalisierung sorgt dafür, dass das führende (höchstwertige) 1-Bit irgendeiner Mantisse ganz nach links rutscht. Hier wird es als Teil der Addition aufgerufen.


    Ich hab ein Beispiel gemacht. Die Hex-Ausgabe hab ich von Mikes Lösung in anderen Thread genommen bzw. angepasst. Es werden die einzelnen Bytes in Hex und Dez. ausgegeben (damit man sich beim POKE dann leichter tut).

    Hier hab ich die Manipulationen, die das RND macht, nachgespielt und nachgesehen, ob das gleiche rauskommt.
    Tut es.



    Ist noch eine Frage offen?
    :D