Rundungsfunktion FloatRound fehlerhaft

  • Hallo,

    ja du hast Recht, dass MakeWWFixed mit Gleitkommazahlen verwendet werden kann war mir gestern Abend einfach nicht mehr gegenwärtig. Allerdings gab es, wenn ich mich richtig erinnere, Probleme mit negativen Zahlen MakeWWFixed(-1) war nicht das Gleiche wie -MakeWWFixed(1). Es wäre ja cool, wenn das jetzt gefixt ist.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Rainer, dann hab ich wohl die neuere lmacros.goh und bisher wurden Dezimalzahlen mit MessageNumberBox richtig angezeigt, auch negative.

    Ich verstehe nach wie vor nicht, warum sich die Nachkommastellenzahl bei round(zahl, nachkommastellenzahl) auf die Ausgabe mit MessageNumberBox und auch PrintNum auswirkt. Ich habe noch ein bisschen rumgespielt und für die 2. Rundung eine neue Variable eingeführt:

    Print("\rRunde 3.86, 1 -> Wilfried: 3.9");
    result = round(3.86,1);
    PrintNum(result);
    MessageNumberBox(result);

    Print("\rRunde 3.86,0 -> Wilfried: 3");
    result2 = round(3.86,0);
    if (result2==3) MessageBox("3");
    if (result2==4) MessageBox("4");
    PrintNum(result2);

    Mit MessageNumberBox(result) wird für result2 der Wert 3 ausgegeben. Wird MessageNumberBox(result) auskommentiert, ergibt sich 4.

    Ein großes Bier für die Erklärung!

    Gruß

    Wilfried

  • Ok, es hat mich wirklich gewurmt. Zunächst glaubte ich an ein Memory Leck, d.h irgendwo ist ein Puffer zu klein und eine Operation überschreibt irgendwelchen Speicher. Aber weit gefehlt. Übertäter ist das Macro MakeWWFixed() - aber nur, wenn es mit einer double varibale benutzt wird. Eine Zahl, wie 4.0 oder 1.5 führt nicht zu einem Problem. Der Unterschied ist wohl, dass die Multiplikation mit einer Zhal zur Compilezeit ausgeführt wird, die Multiplikation mit einer Variablen erfolgt zur Laufzeit.
    Also konkret: MakeWWFixed ist definiert als

    #define MakeWWFixed (fl) ((sdword) ((fl)*65536L))


    Wenn man in der folgenden Routine die markierte Zeile drin lässt, (oder wwf = MakeWWFixed(result) schreibt), liefert das zweite PrintNum() den Wert 3.00 - entfernt man sie ODER ersetzt dort die Variable result durch 4.0, so, liefert die zweite PrintNum() den korrekten Wert 4.00

    Die Zeile versaut also irgendwie die folgenden numerischen Operationen. Hab ich mir damit mein Bier verdient? 8) Na zumindest ein Halbes, oder? ;) An der Stelle ist wohl wieder frehwagen am Zug, oder?

    Rainer

    P.S den ganz aktuellen build kann ich nicht teste, da funktioniert irgend etwas nicht :(

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • So, hier die aktuellsten Infos zum Thema. In der ganz aktuellen Release, auch in der deutschen Version, ist der Fehler bereits behoben. Man muss dazu das Programm mit der **aktuellsten** SDK-Version neu compilieren. Dann wird eine neue library eingebunden, die das Problem behebt.

    Bei mir ist das Programm dann aber (natürlich) nicht mehr kompatibel mit BBX 4.13 und ein reines rüberkopieren der library hilft scheinbar auch nicht. Sobald ich weiß, wo das Problem ist, melde ich mich wieder. Auch wie man das aktuellste SDK baut.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • So, des Rätsels Lösung ist, dass man außer der neuen Library watcomc.geo auch die math.geo kopieren muss. Sollte das nicht reichen, wäre die ansic.geo der nächste Verdächtige. (meine Version ist evt schon etwas neuer als die originale - vielleicht kann mir jemand ein Original schicken, zum ausprobieren) Das ganze natürlich vom Host aus, also bei NICHT laufendem GEOS.
    Hier muss auf jeden Fall noch mal ne praktikable, universelle Lösung her.

    Damit das Testprogramm mit dem ganz neuen SDK auch compiliert, muss man außerdem das platform statement aus der .gp entfernen.

    Wilfried und wen immer es interessiert. So baut man das neues SDK (Schritte 3 bis 5 stehen auch in der readme.md im Repo)

    1. Auf Github den eigenen Fork mit dem von Falk synchronisieren (im eigenen Github ordner: Button "Sync fork")

    2. Auf dem eigenen Rechner die Dateien herunterladen (Git pull)

    Achtung! Vorher KEINE "Sicherheitskopie" des aktuelle Standes des eigen Repo auf dem Rechner machen! Das ist a) nicht nötig (git kann immer zu jedem Stand zurück) und b) mit dem Explorer gar keine gute Idee, weil sonst git in der Kopie mitmischt und die Sicherheitskopie nicht mehr i.o. ist - wer wissen will, wie es trotzdem geht, mailt mich an :)

    3. Die Tools neu bauen (eins der tools musste angepasst werden)

    Code
    Build all the other SDK Tools:
    cd %ROOT_DIR%/Installed/Tools
    pmake install

    4. Die Geoden neu bauen (das clean habe ich eingefügt, damit er auch wirklich alles neu baut)

    Code
    Build all PC/GEOS (target) components:
    cd %ROOT_DIR%/Installed
    clean
    pmake

    4a) sich einen Kaffee holen und ganz in Ruhe genießen :)

    5. Das Target neu bauen

    Code
    Build the target environment:
    cd %ROOT_DIR%/Tools/build/product/bbxensem/Scripts
    perl -I. buildbbx.pl
    the answers to the questions from the above perl-script are:
    nt (for the platform)
    y (for the EC version)
    n (for the DBCS)
    y (for the geodes)
    n (for the VM files)
    and then you'll have to enter the path to a "gbuild"-folder in your LOCAL_ROOT-folder.


    Danach sollte alles Schick sein :)

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Hallo Rainer,

    Hm, ich habe zu Beginn des Jahres eine neue ansic.geo eingespielt (weiß aber den Grund nicht mehr:(), die vorherige aber nicht gelöscht. Die ist von 04.2005, meinst du die?

    Das SDK-Update werde ich mir in Ruhe ansehen. Oder ich warte bis November;)

    Wilfried

  • Hm, ich habe zu Beginn des Jahres eine neue ansic.geo eingespielt (weiß aber den Grund nicht mehr :( ), die vorherige aber nicht gelöscht. Die ist von 04.2005, meinst du die?

    Meine ist auch von 04/2005 - wichtig ist nicht das Datum, sondern die intern hinterlegte protocoll-nummer. Grundregel: solange es geht, braucht man nix neues ;)

    Im November hättest du zumindest im Notfall Support, wenn es doch daneben geht :)

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.