none
Mod演算子の仕様 RRS feed

  • 質問

  • なぜMod演算子は、被演算値の符号に準じて負の値もとり得る仕様なのでしょうか。

    ExcelのMOD関数は、一般的な正の値のみを返す仕様です。

    剰余演算の結果が正負混在していると、非常に扱いづらいです。どのようなポリシーでこのような仕様なのでしょうか。開発者の方々に伺いたいです。

    2020年1月21日 8:49

すべての返信

  • 「被除数 Mod 除数」において、被除数および除数が負数の場合の動作は処理系依存です。

    たとえば被除数 = 7、除数 = -3 の場合、剰余の取り方としては
     剰余 -2 … (-3) * (-3) - 2 = 7
     剰余 +1 … (-2) * (-3) + 1 = 7
    のいずれの形にもなりえます。

    '【パターンA】
    +7 Mod -3 = -2
    -7 Mod +3 = +2
    +7 Mod +3 = +1
    -7 Mod -3 = -1
    
    '【パターンB】
    +7 Mod -3 = +1
    -7 Mod +3 = -1
    +7 Mod +3 = +1
    -7 Mod -3 = -1

    前者の例は、Windows 10 の電卓アプリ(関数電卓モード)や Excel の Mod 関数。
    後者の例は、Windows 7 の電卓アプリ(関数電卓モード)や VBA の Mod 演算子。


    どのようなポリシーでこのような仕様なのでしょうか。

    VB/VBA の Mod 演算子で剰余演算した結果の符号は、被除数 (演算子の左側の数値) の符号になります。
    Excel の MOD 関数で剰余演算した結果の符号は、除数(演算子の右側の数値)の符号になります。

    VBA の Mod 演算子は「被除数 - (除数 * (被除数 \ 除数))」に相当します。小数を指定すると整数に丸められます。
    VB.NET の Mod 演算子は「被除数 - (除数 * Fix(被除数 / 除数))」に相当します。こちらは小数もサポートしています。
    Excel の MOD 関数は「被除数 - (除数 * Int(被除数 / 除数))」です。小数もサポートされています。

    たとえば 47.9 Mod 9.35 を求めた場合、
    VB.NET では「1.15」を返しますが、
    VBA では 48 Mod 9 の整数に丸められて「3」を返します。

    • 編集済み 魔界の仮面弁士MVP 2020年1月22日 2:40 訂正:序数→除数、追加:Fix および Int による代替式
    2020年1月21日 10:27