In primo luogo, ripeterò che un modulo b dovrebbe essere uguale a a - b * (a div b), e se una lingua non lo prevede, sei in un pasticcio matematico terribile. Quell'espressione a - b * (a div b) è in realtà il numero di implementazioni che calcolano un modulo b.
Ci sono alcuni possibili razionali. Il primo è che si desidera la massima velocità, quindi un div b è definito come qualunque sia il processore utilizzato. Se il tuo processore ha un'istruzione "div", allora un div b è qualunque cosa l'istruzione div faccia (purché non sia totalmente pazza).
Il secondo è che vuoi un comportamento matematico specifico. Consideriamo innanzitutto b > 0. È abbastanza ragionevole che il risultato di un div b sia arrotondato a zero. Quindi 4 div 5 = 0, 9 div 5 = 1, -4 div 5 = -0 = 0, -9 div 5 = -1. Questo ti dà (-a) div b = - (a div b) e (-a) modulo b = - (a modulo b).
Questo è abbastanza ragionevole ma non perfetto; per esempio (a + b) div b = (a div b) + 1 non regge, diciamo se a = -1. Con un fisso b > 0, ci sono di solito (b) possibili valori per un tale che un div b dà lo stesso risultato, tranne che ci sono 2b - 1 valori a da -b + 1 a b-1 dove un div b è uguale a 0. Significa anche che un modulo b sarà negativo se a è negativo. Vorremmo che un modulo b fosse sempre un numero compreso tra 0 e b-1.
D'altra parte, è anche abbastanza ragionevole richiedere che mentre si passa attraverso i valori successivi di a, un modulo b dovrebbe passare attraverso i valori da 0 a b-1 quindi iniziare di nuovo con 0. E per richiedere che (a + b) div b sia (a div b) + 1. Per ottenere ciò, si desidera che il risultato di un div b sia arrotondato verso -infinity, quindi -1 div b = -1. Ancora una volta, ci sono degli svantaggi. (-a) div b = - (a div b) non regge. Ripetutamente dividendo per due o per qualsiasi numero b > 1 alla fine non ti darà un risultato di 0.
Poiché ci sono conflitti, le lingue dovranno decidere quale serie di vantaggi è più importante per loro e decidere di conseguenza.
Per il negativo b, la maggior parte delle persone non riesce a capire cosa devono essere in primo luogo un div b e un modulo b, quindi un modo semplice è definire che un div b = (-a) div (- b) e un modulo b = (-a) modulo (-b) se b < 0, o qualunque sia il risultato naturale dell'uso del codice per il positivo b.