TI-Basic: Programme und Tutorials: Division mit Rest (Modulo)

Erstellt von: Peter Riedel
Schwierigkeitsgrad: fortgeschritten
Modell: Voyage 200

Division mit Rest (Modulo)

Bearbeiten

Diese Funktion fixt einen Bug, der mir bei der mitgelieferten Modulo-Funktion mod(dividend,divisor) des Voyage 200 aufgefallen ist. Wenn Dividend und Divisor unterschiedliche Vorzeichen haben und der Betrag beider Zahlen nicht gleich ist, wird ein falscher Rest ausgegeben, weil offensichtlich keine Fallunterscheidung bezogen auf die Vorzeichen des Dividenden und Divisors stattfindet. Falls doch, wurde es fehlerhaft implementiert. Folgende Modulo-Funktion wird eine vollständige und richtige Fallunterscheidung abhängig von den Vorzeichen des Dividenden und Divisors machen. Wenn der Divisor 0 sein sollte, wird nichts gerechnet, sondern als Ergebnis nur der Dividend zurückgegeben. Das Vorzeichen des Rests entspricht dem Vorzeichen des Dividenden, kann nach Belieben aber auch durch *-1 umgekehrt werden, falls jemand grundsätzlich nur positive oder negative Reste zurückerhalten will. Zu beachten ist, dass es sich beim Minus vor der Eins nicht um den binären Operator handelt, sondern um das kleine Minus, das als Vorzeichen dient. Im Home lässt sich die Funktion modulo(dividend,divisor) aufrufen, indem man ihr zwei Parameter übergibt, wovon der erste der Dividend und der zweite der Divisor ist.

Wünschenswert wäre eine Überprüfung des Bugs bei anderen Modellen und ob dort der Fix einwandfrei funktioniert oder umgeschrieben werden muss.

Funktion

Bearbeiten
:modulo(dividend,divisor)
:Func
:If divisor>0 Then
:  If dividend≥0 Then
:    While dividend≥divisor
:      dividend-divisor->dividend
:    EndWhile
:    Return dividend
:  Else
:    While dividend≤divisor*-1
:      dividend+divisor->dividend
:    EndWhile
:    Return dividend
:  EndIf
:ElseIf divisor<0 Then
:  If dividend≥0 Then
:    While dividend≥divisor*-1
:      dividend+divisor->dividend
:    EndWhile
:    Return dividend
:  Else
:    While dividend≤divisor
:      dividend-divisor->dividend
:    EndWhile
:    Return dividend
:  EndIf
:EndIf
:Return dividend
:EndFunc

Liste der verwendeten Befehle

Bearbeiten