剰余演算による余りの算出
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/08/01 22:52 UTC 版)
「剰余演算」の記事における「剰余演算による余りの算出」の解説
さまざまなプログラミング言語の整数剰余演算子言語演算子符号ActionScript % 被除数と同一 Ada mod 除数と同一 rem 被除数と同一 ASP Mod 未定義 ALGOL-68 ÷×, mod 常に正 AMPL(英語版) mod 被除数と同一 APL | 除数と同一 AppleScript mod 被除数と同一 AWK % 被除数と同一 BASIC Mod 未定義 bash % 被除数と同一 bc % 被除数と同一 C (ISO 1990) % 実装による div 被除数と同一 C++ (ISO 1998) % 実装による div 被除数と同一 C (ISO 1999) %, div 被除数と同一 C++ (ISO 2011) %, div 被除数と同一 C# % 被除数と同一 Clarion (programming language)(英語版) % 被除数と同一 Clojure mod 除数と同一 COBOL FUNCTION MOD 除数と同一 CoffeeScript % 被除数と同一 %% 除数と同一 ColdFusion %, MOD 被除数と同一 Common Lisp mod 除数と同一 rem 被除数と同一 D % 被除数と同一 Dart % 常に正 remainder() 被除数と同一 Eiffel \\ 被除数と同一 Erlang rem 被除数と同一 Euphoria mod 除数と同一 remainder 被除数と同一 F# % 被除数と同一 FileMaker Mod 除数と同一 Forth mod 実装による FORTRAN mod 被除数と同一 modulo 除数と同一 Frink mod 除数と同一 GameMaker: Studio(英語版) (GML) mod 被除数と同一 GDScript % 被除数と同一 Go % 被除数と同一 Haskell mod 除数と同一 rem 被除数と同一 Haxe % 被除数と同一 J |~ 除数と同一 Java % 被除数と同一 Math.floorMod 除数と同一 JavaScript % 被除数と同一 Julia mod 除数と同一 rem 被除数と同一 LibreOffice =MOD() 除数と同一 Lua 5 % 除数と同一 Lua 4 mod(x,y) 除数と同一 Liberty BASIC(英語版) MOD 被除数と同一 MathCad(英語版) mod(x,y) 除数と同一 Maple e mod m 常に正 Mathematica Mod 除数と同一 MATLAB mod 除数と同一 rem 被除数と同一 Maxima mod 除数と同一 remainder 被除数と同一 Maya Embedded Language(英語版) % 被除数と同一 Microsoft Excel =MOD() 除数と同一 Minitab MOD 除数と同一 mksh % 被除数と同一 Modula-2 MOD 除数と同一 MUMPS # 除数と同一 NASM NASMX % 符号なし剰余演算子 %% 符号付き剰余演算子 Oberon MOD 除数と同一 OCaml mod 被除数と同一 Occam \ 被除数と同一 Pascal (Delphi) mod 被除数と同一 Pascal (ISO-7185 および ISO-10206) mod 常に正 Perl % 除数と同一 PHP % 被除数と同一 PIC Basic Pro \\ 被除数と同一 PL/I mod 除数と同一 (ANSI PL/I) PowerShell % 被除数と同一 Progress(英語版) modulo 被除数と同一 Prolog (ISO 1995) mod 除数と同一 rem 被除数と同一 Python % 除数と同一 math.fmod 被除数と同一 Racket remainder 被除数と同一 RealBasic(英語版) MOD 被除数と同一 R %% 除数と同一 REXX // 被除数と同一 RPG %REM 被除数と同一 Ruby %, modulo() 除数と同一 remainder() 被除数と同一 Rust % 被除数と同一 Scala % 被除数と同一 Scheme modulo 除数と同一 remainder 被除数と同一 Scheme R6RS mod 常に正 mod0 0に近い側 Seed7(英語版) mod 除数と同一 rem 被除数と同一 SenseTalk(英語版) modulo 除数と同一 rem 被除数と同一 Smalltalk \\ 除数と同一 rem: 被除数と同一 SQL (SQL:1999) mod(x,y) 被除数と同一 Standard ML mod 除数と同一 Int.rem 被除数と同一 Stata mod(x,y) 常に正 Swift % 被除数と同一 Tcl % 除数と同一 Torque Game Engine(英語版) % 被除数と同一 Turing mod 除数と同一 Verilog (2001) % 被除数と同一 VHDL mod 除数と同一 rem 被除数と同一 Visual Basic Mod 被除数と同一 x86 Assembly(英語版) IDIV 被除数と同一 Xbase++(英語版) % 被除数と同一 Mod() 除数と同一 Z3 theorem prover div, mod 常に正 さまざまなプログラミング言語の浮動小数点数剰余演算子言語演算子符号C (ISO 1990) fmod 被除数と同一 C (ISO 1999) fmod 被除数と同一 remainder 0に近い側 C++ (ISO 1998) std::fmod 被除数と同一 C++ (ISO 2011) std::fmod 被除数と同一 std::remainder 0に近い側 C# % 被除数と同一 Common Lisp mod 除数と同一 rem 被除数と同一 D % 被除数と同一 Dart % 常に正 remainder() 被除数と同一 F# % 被除数と同一 FORTRAN mod 被除数と同一 modulo 除数と同一 Go math.Mod 被除数と同一 Haskell (GHC) Data.Fixed.mod' 除数と同一 Java % 被除数と同一 JavaScript % 被除数と同一 Microsoft Excel =MOD() 除数と同一 OCaml mod_float 被除数と同一 Perl POSIX::fmod 被除数と同一 Raku % 除数と同一 PHP fmod 被除数と同一 Python % 除数と同一 math.fmod 被除数と同一 REXX // 被除数と同一 Ruby %, modulo() 除数と同一 remainder() 被除数と同一 Scheme R6RS flmod 常に正 flmod0 0に近い側 Standard ML Real.rem 被除数と同一 Swift % 被除数と同一 Xbase++(英語版) % 被除数と同一 Mod() 除数と同一 数学的には、剰余演算の結果はユークリッド除法における余りのことである。しかし、別の法則に従って算出されることもある。コンピュータやその他の計算機は数値の保持や処理方法がさまざまなので、剰余演算の定義はプログラミング言語や動作するハードウェアによって、それぞれ規定されている。 ほぼすべてのコンピュータシステムにおいて、a を n で除算した商 q および剰余 r は下記の条件を満たす。 q ∈ Z a = n q + r | r | < | n | {\displaystyle {\begin{aligned}q\,&\in \mathbb {Z} \\a\,&=nq+r\\|r|\,&<|n|\end{aligned}}} (1) ところが、剰余が0でない場合、その符号は不確定なものとなる。数論上は、余りは常に正の数となるが、プログラミング言語によっては a および n の符号によって剰余の符号が正となるか負となるかが定められる。標準的なPascalおよびAlgol68では、除数が負数であっても正の剰余(または0)を出力する。しかし、C90のようなプログラミング言語では、n または a が負の数の場合にはそうならないことがある。詳細は右表を参照。多くのシステムでは a の 0 での剰余は未定義だが、いくつかは a を出力するように定義されている。 多くの実装においては「0への切捨て除算」が使用されている。これは商を0への切捨て関数 q = trunc(a/n) によって処理し、(1)の処理における余りは「被除数と同じ符号」となる。この場合の商は0方向に丸められる。つまり、実数での商から0の方向へ向かって直近の整数となる。 ドナルド・クヌースは「切り下げ除算」について言及した。これは商を床関数 q = ⌊ ( a / n ) ⌋ {\displaystyle q=\lfloor (a/n)\rfloor } によって処理し、(1)の処理における余りは「除数と同じ符号」となる。床関数によって、商が負の数であっても常に負の無限大方向に丸められる。 r = a − n ⌊ a n ⌋ {\displaystyle r=a-n\left\lfloor {\frac {a}{n}}\right\rfloor } Raymond T. Bouteはユークリッド除法の手法での定義について言及している。この場合、余りは非負数(0 ≤ r)となる。右表では「常に正」と表記している。この定義は下記のように表すことができる。 n > 0 ⇒ q = ⌊ a n ⌋ {\displaystyle n>0\Rightarrow q=\left\lfloor {\frac {a}{n}}\right\rfloor } n < 0 ⇒ q = ⌈ a n ⌉ {\displaystyle n<0\Rightarrow q=\left\lceil {\frac {a}{n}}\right\rceil } また、符号関数 sgn を使用すると、下記のようにも表せる。 q = sgn ( n ) ⌊ a | n | ⌋ {\displaystyle q=\operatorname {sgn}(n)\left\lfloor {\frac {a}{\left|n\right|}}\right\rfloor } r = a − | n | ⌊ a | n | ⌋ {\displaystyle r=a-|n|\left\lfloor {\frac {a}{\left|n\right|}}\right\rfloor } Common Lispでは切り下げ除算、切り上げ除算のそれぞれについてq = round(a/n) と q = ceil(a/n) で商が与えられる。 IEEE 754-1985 の剰余は、近接丸め(英語版)を行った場合の商として定義している。したがって、剰余の符号は「0に近い側」となる。 Daan Leijenはこう記している。 Bouteはユークリッド除法が数学的に一般的で有用なので他の方法よりも優れていることを示した。しかし、クヌースの示した切り下げ除算もまたよい定義である。「0への切捨て除算」は幅広く使われているが、他の定義よりも劣っている。 —Daan Leijen、Division and Modulus for Computer Scientists
※この「剰余演算による余りの算出」の解説は、「剰余演算」の解説の一部です。
「剰余演算による余りの算出」を含む「剰余演算」の記事については、「剰余演算」の概要を参照ください。
- 剰余演算による余りの算出のページへのリンク