%REM
Reste d'une division
Renvoie le reste de la division entière de deux nombres. Le reste prend le signe du dividende.
Syntaxe
%REM(dividende : diviseur)
dividende- Un nombre entier (zone ou expression sans décimales).
diviseur- Un nombre entier, non nul.
- Résultat
- Un entier : le reste, de même signe que le dividende.
%REM(-17 : 5)vaut -2.
À quoi ça sert
Le reste sert à tester la parité (%REM(n : 2) = 0), à répartir en tournée (un client sur trois), à calculer une clé de contrôle ou à faire tourner un compteur dans un cycle. Il complète %DIV : %DIV(a : b) * b + %REM(a : b) redonne a.
Exemple 1 : Signes et parité
**free
// %REM : reste d'une division entiere - il prend le signe du dividende.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s numero int(10) inz(1247);
dcl-s decalage int(10) inz(-17);
dcl-s cycle int(10) inz(5);
dcl-s pos int(10);
snd-msg '%REM(17 : 5) : ' + %char(%rem(17 : 5));
snd-msg '%REM(-17 : 5) : ' + %char(%rem(-17 : 5));
snd-msg '%REM(17 : -5) : ' + %char(%rem(17 : -5));
snd-msg '%REM(-17 : -5) : ' + %char(%rem(-17 : -5));
if %rem(numero : 2) = 0;
snd-msg %char(numero) + ' est pair';
else;
snd-msg %char(numero) + ' est impair';
endif;
// Un modulo toujours positif : on ajoute le diviseur puis on reprend le reste.
pos = %rem(%rem(decalage : cycle) + cycle : cycle);
snd-msg 'Position dans le cycle de 5 pour -17 : ' + %char(pos);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
%REM(17 : 5) : 2
%REM(-17 : 5) : -2
%REM(17 : -5) : 2
%REM(-17 : -5) : -2
1247 est impair
Position dans le cycle de 5 pour -17 : 3
Les quatre combinaisons de signes donnent 2, -2, 2 et -2 : le reste suit le signe du dividende, jamais celui du diviseur. Le numéro 1247 est impair car son reste par 2 n'est pas nul.
La dernière ligne montre la technique du reste toujours positif. -17 dans un cycle de 5 doit tomber en position 3 : on ajoute le diviseur au premier reste (-2 + 5 = 3), puis on reprend le reste.
Le piège
Un dividende négatif donne un reste négatif. %REM(-17 : 5) vaut -2, pas 3 comme pour le modulo d'un tableur. Pour un indice de cycle (jour de la semaine, tournée), un reste négatif fait sortir du tableau. La formule %REM(%REM(x : n) + n : n) donne toujours un résultat de 0 à n - 1. Comme pour %DIV, un diviseur nul arrête le programme (MCH1211) et un opérande décimal est refusé à la compilation (RNF0553).