Verständnis-Problem bei der Berechnung von REAL Werten

  • Hallo geschätzte Roboter-Enthusiasten


    Ich erhalte bei meiner Berechnung von REAL Werten ein (falsches) Ergebnis mit vielen Nachkommastellen, das dem erwarteten (richtigen) Ergebnis sehr nahe kommt aber eben nicht 100% richtig ist. Hier mal der Code:


    Sinn des Ganzen ist, anhand eines von der SPS übergebenen Winkels meinen TCP zu rotieren, und zwar entweder um bis zu +90° oder eben in die andere Richtung.
    :backtotopic:
    Ich erhalte nun in der Variablen "ANGLE" seltsame Ergebnisse wie z.B. -0.399993896


    Vollständiges Beispiel:
    giTcpTorsion zB. = > 1796


    ANGLE = 1796
    1796 / 10 = 179,6
    179,6 - 180.0 = -0,4
    In der REAL Variablen steht aber stattdessen -0.399993896 :nocheck:


    Ebenso charakteristisch für diesen Fehler ist, dass sich die Werte bis auf die neunte Nachkommastelle wiederholen, also bei gleichem Eingangswert das gleiche (falsche) Ergebnis liefern. Weitere Ergebnisse (abhängig vom Wert auf der Schnittstelle) sind z.B.:

    Code
    -0.500000
    -0.100006104
    -0.300003052
    0.300000
    0.600000
    -0.800003052
    -0.600006104
    -0.399993896
    -0.699996948


    Die negativen Ergebnisse liegen also meistens sehr nah an den richtigen, sind aber eben doch nicht immer ganz korrekt. Die positiven Ergebnisse scheinen immer zu passen...


    Das Ganze riecht mir irgendwie nach REAL - INTEGER Konflikt bzw. Rundungsfehler, aber ich verstehe nicht was ich falsch mache...
    Kann mir das bitte mal jemand erklären?

  • Schritt für Schritt zum Roboterprofi!

  • Autsch... :schwitz: ...das hat gezwiebelt...


    Zitat vom Wikipedia-Artikel:

    Zitat


    [size=2]Gleitkommazahlen warten besonders für den mathematischen Laien mit einigen Überraschungen auf...... ......so[/size][size=2] erwartet der unbefangene Laie als korrekt gerundetes Ergebnis......[/size]


    Also... ...wenn ich als unbefangener Laie das richtig verstanden habe liegt das Problem bei der Gleitkomma-Arithmetik bei den Rundungsfehlern aufgrund der begrenzten Genauigkeit.
    Was ich dann aber immer noch nicht verstanden habe ist, warum beim Berechnen von
    1796 / 10,0
    oder bei
    179,6 - 180,0
    Rundungsfehler auftreten sollen, bei nur einer Nachkommastelle? :nocheck:


    Wäre weiterhin dankbar, wenn jemand Licht in mein Dunkel bringen würde.


  • Im genannten Wikipedia-Artikel ist unter der Überschrift 'Dezimalbrüche' zu lesen:
    "Schon einfache Dezimalbrüche wie 0,1 können nicht exakt als binäre Gleitkommazahlen dargestellt werden, da jede rationale Zahl, deren gekürzter Nenner keine Zweierpotenz ist, im Binärsystem zu einer nicht abbrechenden, periodischen Darstellung führt."


    Die Zahl 179.6 gehört ebenso wie die 0.1 zu den Zahlen, die nicht exakt dargestellt werden können und bei denen es dann zu Rundungsfehlern in den letzten Nachkommastellen kommt.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden