Un modo per vedere i diversi è quello di eseguire una rapida simulazione in un banco di prova, per esempio, utilizzando un processo di questo tipo:
process is
begin
report " 9 mod 5 = " & integer'image(9 mod 5);
report " 9 rem 5 = " & integer'image(9 rem 5);
report " 9 mod (-5) = " & integer'image(9 mod (-5));
report " 9 rem (-5) = " & integer'image(9 rem (-5));
report "(-9) mod 5 = " & integer'image((-9) mod 5);
report "(-9) rem 5 = " & integer'image((-9) rem 5);
report "(-9) mod (-5) = " & integer'image((-9) mod (-5));
report "(-9) rem (-5) = " & integer'image((-9) rem (-5));
wait;
end process;
Esso mostra il risultato sia:
# ** Note: 9 mod 5 = 4
# ** Note: 9 rem 5 = 4
# ** Note: 9 mod (-5) = -1
# ** Note: 9 rem (-5) = 4
# ** Note: (-9) mod 5 = 1
# ** Note: (-9) rem 5 = -4
# ** Note: (-9) mod (-5) = -4
# ** Note: (-9) rem (-5) = -4
Wikipedia - Modulo operation ha una descrizione elaborata, comprese le norme:
- mod è segno di divisore, quindi
n
in a mod n
- rem ha segno del dividendo, quindi
a
in a rem n
L'operatore mod
dà il residuo per una divisione che si arrotonda (divisione pavimentata), quindi a = floor_div(a, n) * n + (a mod n)
. Il vantaggio è che a mod n
è un grafico a dente di sega ripetuto quando a
aumenta anche con zero, il che è importante in alcuni calcoli.
L'operatore rem
fornisce il resto per la divisione intera regolare a/n
che arrotonda verso 0 (divisione troncata), quindi a = (a/n) * n + (a rem n)
.
fonte
2014-09-15 14:15:09
http://computer-programming-forum.com/42-vhdl/6f9dce015f5ce94f.htm –