Autor Thema: Modulo operation  (Gelesen 10919 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline hugo

  • Global Moderator
  • *****
  • Beiträge: 2 150
    • Profil anzeigen
Modulo operation
« am: 31. Oktober 2008, 11:46:20 »
in der programmierung wird sehr häufig die modulo operation a mod m eingesetzt.
allerdings sind hierbei ein paar dinge zu beachten um überraschungen zu vermeiden.

die Modulo funktion ist ist einheitlich definiert !!!
ein guter artikel hierzu findet sich in der englischen wickipedia unter: http://en.wikipedia.org/wiki/Modulo_operation

1. nicht immer ist gewährleistet das a mod 0 auch funktioniert und eine 0 liefert.
2. es gibt unterschiedliche Implementationen für negative Argumente der MOD funktion.

Im falle von Codesys ergibt sich :
a mod 0 = 0
0 mod m = 0
-a mod m ergibt -r
-a mod -m ergibt -r
a mod m ergibt +r
a mod -m ergibt +r

damit folgt codesys einer üblichen Implementation a mod m = a - n * floor(a/m)
aber selbst hier ist äusserste Vorsicht geboten!
das auch codesys für verschiedenen Targets unterschiedlichen Code linkt ist nicht sichergestellt das dies auch mit allen taregts so funktioniert.

ein ausweg aus diesem Dilemma ist wie folgt:
die mod funktion nur für positive argumente a und m anwenden, sonst ist nicht sichergestellt das beim targetwechsel oder von simulation zu target immer dasselbe ergebnis herauskommt.

Wer zwingend auf negative argumente der modulo funktion angewiesen ist kann die modulo funktion ersetzen durch:
a mod m = n * floor2(a/m), floor2 ist in der oscat lib bereits enthalten.
« Letzte Änderung: 31. Oktober 2008, 12:17:03 von hugo »