Ergebnis 1 bis 18 von 18

Thema: Expertenfrage (Rundungsfehler des Makers umgehen - wie?)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Whoa jetzt kommen wieder die Mathematiker daher, ellenlange Formeln im Gepäck und behaupten, ihre Lösung sei einfacher xD

    Ne, Spaß beiseite. Dein Rundungs-"Trick" ist sicherlich schön und gut. Aber. Das Runden an sich ist - as said - nie das Problem gewesen. Das habe ich ja schon vorher mit Makenshi besprochen. Der Titel des Threads ist vielleicht etwas... ungünstig gewählt, da der Rundungsfehler nicht das Kernproblem darstellt, wie sich im weiteren Verlauf der Diskussion herausgestellt hat. Der Maker rundet nämlich durchaus richtig, nur hat mein usprünglicher Code den Rundungsfehler immer wieder "mitgeschleppt" und ihn durch nichts wieder ausgleichen können. De facto ist meiner Meinung nach die Multiplikation mit 10.000 (oder einer noch höheren Zahl) die einzig wirklich gangbare Möglichkeit zur effektiven Lösung dieses Problems mit den Mitteln, die einem im RPG-Maker zur Verfügung stehen, da somit das Rechnen mit Kommazahlen zumindest soweit "simuliert" wird, dass die maximale Abweichung vom vorausberechneten Ergebnis höchstens 1 Pixel betragen kann. Natürlich tritt der Fehler nach wie vor auf, wenn man dann mit den gerundeten Koordinaten weiterrechnet, aber wenn man für die weitere Berechnung auf die exakten, mit 10.000 multiplizierten, Koordinaten zurückgreift, beträgt der maximale Rundungsfehler nur 1 Pixel.

    Trotzdem vielen Dank für deine Anregungen!


    Greetz!


    Alan

  2. #2
    Zitat Zitat von Alan Beitrag anzeigen
    [...] Der Maker rundet nämlich durchaus richtig [...]
    Das ist falsch, wurde vor mir aber auch schon angemerkt. Alle mathematischen Operationen im RPG Maker sind Integeroperationen, d.h., nach einer Division entsteht ein ganzzahliges Ergebnis und ein ganzzahliger Rest (Assembler-Programmierern müsste das bekannt vorkommen), wobei nur das Ergebnis verwendet wird und der Rest verworfen. Das entspricht dem Abschneiden der Nachkommastellen bei einer Gleitkommazahl, oder - für positive Gleitkommazahlen - dem Abrunden (Gaußklammer).

    Bei deiner bisherigen Lösung verwendest du Festkommazahl-Arithmetik, d.h., du skalierst die Zahlen vor den Berechnungen mit einem Faktor, führst die Berechnungen bei einer höheren Präzision durch und konvertierst das Ergebnis dann in eine Gleitkommazahl mit dem Teilen durch den Skalierungsfaktor, wobei automatisch eine Ganzzahl entsteht, da die Division eine Integeroperation ist.
    Das ist im Grunde die Standard-Vorgehensweise, die so auch in Sprachen wie C/C++ Einsatz findet, wenn die hohe Ausführungsgeschwindigkeit von Integeroperationen gewünscht wird, man aber nicht auf die Präzision von Gleitkommaoperationen verzichten will (wobei man da aber aus Optimierungsgründen mit Zweierpotenz-Faktoren rechnet).

    Insofern ist dein Ansatz schon richtig, allerdings (wie schon oben gesagt) gehst du falsch in der Annahme aus, dass das Ergebnis gerundet wird. Um tatsächlich zu runden, musst du, wie CapSeb schon offenlegte, eine Korrektur vor der Konvertierung durchführen, indem du die Hälfte des Divisors hinzuaddierst.
    Aufpassen musst du aber bei negativen Zahlen, denn dann musst du abziehen, statt addieren.

  3. #3
    Oh, der Maker schneidet die Nachkommastellen also einfach ab? War mir auch neu - ich dachte immer, er rundet ab x,5 auf und darunter ab. Aber - man lernt nie aus! Von daher könnte es durchaus sein, dass man einmal auf den Trick von CabSeb zurückgreifen muss... ich werde ihn im Hinterkopf behalten, thx!



    Greetz!


    Alan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •