web-dev-qa-db-ja.com

VHDLのmod演算子とrem演算子の違いは?

VHDLプログラミングでこれらのステートメントに遭遇し、2つの演算子modとremの違いを理解できませんでした

    9 mod 5
    (-9) mod 5
    9 mod (-5)
    9 rem 5
    (-9) rem 5
    9 rem (-5)
12
musicakc

違いを確認する方法は、たとえば次のようなプロセスを使用して、テストベンチでクイックシミュレーションを実行することです。

_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;
_

結果は次のようになります。

_# ** 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 にはルールを含む詳細な説明があります:

  • modには除数の符号があるため、_a mod n_のn
  • remには配当の兆候があるため、_a rem n_のa

mod演算子は、切り捨てられた除算(床除算)の剰余を与えるため、a = floor_div(a, n) * n + (a mod n)です。利点は、aがゼロでも増加しているときに_a mod n_が繰り返し鋸歯状グラフになることです。これは一部の計算で重要です。

rem演算子は、通常の整数除算_a / n_の剰余を0に丸める(切り捨てられた除算)ため、a = (a / n) * n + (a rem n)になります。

27
Morten Zilmer
For equal sign:
9/5=-9/-5=1.8 gets 1 
9 mod 5 = 9 rem 5
-9 mod -5 = -9 rem -5
-----------------------------------------
For unequal signs:
9/-5 = -9/5 = -1.8
In "mod" operator : -1.8 gets -2
In "rem" operator : -1.8 gets -1
----------------------------------------
example1: (9,-5)
9 = (-5*-2)-1  then:  (9 mod -5) = -1
9 = (-5*-1)+4  then:  (9 rem -5) = +4
----------------------------------------
example2: (-9,5)
-9 = (5*-2)+1  then:  (-9 mod 5) = +1
-9 = (5*-1)-4  then:  (-9 rem 5) = -4
----------------------------------------
example3: (-9,-5)
-9 = (-5*1)-4  then:  (-9 mod -5) = -4
-9 = (-5*1)-4  then:  (-9 rem -5) = -4
----------------------------------------
example4: (9,5)
9 = (5*1)+4  then:  (9 mod 5) = +4
9 = (5*1)+4  then:  (9 rem 5) = +4
0