UE4 verfälscht große Floats

  • Hey,

    ich habe gerade folgendes Problem:

    ich muss in UE4 sehr große Zahlen ausrechnen lassen (z.B. 2.500.000 * 2.000.000.000). Leider verfälscht Unreal Engine diese großen Ergebnisse, sodass dann als Ergebnis z.B. nicht 5.000.000.000.000.000, sondern 5.000.000.136.282.112 angezeigt wird.

    Ich benutze für die Berechnungen Floats

    Wie kann ich verhindern, dass Unreal Engine die Zahlen verändert?

    Die Zahlen müssen auf mindestens eine Nachkommastelle genau sein.

    Da oben leider (noch) nicht verfügbar: ich benutze UE 4.23

  • Bob

    Danke. Hab nur oben ein schlechtes Beispiel gebracht. In der Rechnung kann einer der Zahlen auch eine Nachkommastelle beinhalten. Hättest du da auch ne Idee?

    Ich könnte zwar theoretisch alles mal zehn rechnen und in int64 umwandeln lassen (vor der Rechnung) und am Schluss (da ist die Zahl wieder einigermaßen klein) durch zehn teilen und in ein Float umwandeln. Dann müsste ich jedoch meine ganzen Rechnungen umstellen, daher wäre eine andere Methode besser.

  • Das Problem ist, das du versuchst zuviele Daten in zuwenig Bits zu speichern. Du brauchst einen anderen Datentyp um soviele Informationen zu speichern.

    Ich habe damals folgenden Beitrag verfasst, vielleicht hilft es dir weiter:
    Hohe Zahlen mit Float/Int
    :)

  • Im Grunde kommst du nun bei der realität an, dass die ganze Analysis die man in der Schule lernt nur bedingt nützlich ist, wenn man in der digitalen Welt ist. Jetzt kommst du in den Bereich der Numerischen Mathematik.


    BTW du solltest auch noch folgende kritische Fragen an deinen Code/BP stellen, falls du mehr als Float benötigst.


    Benötigst du die Präzision?

    Kannst du die Formel irgendwie umstellen, um das Problem zu verhindern?

    Kannst du das Problem ganz anders lösen, so dass die Situation nicht vorkommt?



    Ein wenig Hintergrund warum du das Problem hast:

    Eine Gleitkomma Zahl ist eine Zahl im Format:

    Vorzeichen * Mantisse * Basis ^ Exponent


    Für einen Float hat nach IEEE754 hat die Mantisse 23 Bit, der Exponent 8 Bit und dann gibt es noch 1 Vorzeichen Bit. Die Basis ist dabei immer 2.


    Das heißt ein float ist immer eine Zahl für die folgendes Gilt:


    Vorzeichen * Mantisse * 2 ^ Exponent


    Damit kann man sehr große und sehr kleine Zahlen darstellen, aber es bietet nur genug präzision für 7 dezimal stellen, was dahinter passiert ist abhängig davon wie dein Prozessor floats berechnet (das Ergebnis von floating point Operationen kann von Prozessor zu Prozessor variieren und auch von compiler zu compiler, wie ich im Beruf feststellen musste) und was die nächst beste mögliche zahl ist die mit S*M*2^E dargestellt werden kann.

    Über sowas sollte man sich durchaus Gedanken machen wenn man programmiert.

    Schlimmstenfalls könnte der Fehler eine Kettenreaktion auslösen: Fehler pflanzt sich fort und wird immer größer. Z.B. wenn Physikengines verrückt spielen, sind es oft solche numerische Effekte. Manchmal lässt sich sowas verhindern, wenn man seine Formeln auf Präzision optimiert, manchmal muss man damit leben.


    Es gibt BTW genügend Literatur zu sowas. Bestimmt auch Online (viele Unis haben auch Vorlesungsscripte/Folien verfügbar, da kann man bestimmt was finden). Stichworte: Numerik, Fehleranalyse, Gleitkommazahlen.