模除
模除(英语:modulo 有时也称作 modulus),又称模数、取模、取模运算等,它得出一个数除以另一个数的余数。给定两个正数:被除数和除数,(通常缩写为),得到的是使用欧几里得除法时的余数。所得之数被称为的小数部分。
举个例子:计算表达式得到,因为的商为而余数为;而得到,因为的商为而余数为;做除法不能整除时得到是有理数,平常使用的计算器采用了有限个数位的十进制表示法,它以小数点分隔整数部分和小数部分,比如。
虽然通常情况下模除的被除数和除数都是整数,但许多计算系统允许其他类型的数值运算,比如对浮点数取模。在所有计算系统中当被除数和除数都是正数时,结果的余数的范围为;而经常是未定义的,在编程语言里可能会导致除以零错误。当被除数或除数为负数时,不同的编程语言对结果有不同的处理。
各种定义
在数学中,取模运算的结果就是欧几里德除法的余数。当然也有许多其他的定义方式。计算机和计算器有许多种表示和储存数字的方法,因此在不同的硬件环境下、不同的编程语言中,取模运算有着不同的定义。
几乎所有的计算系统中, 除以 得到商 和余数 均满足以下式子:
即使如此,当余数非 时,余数的符号仍然是有歧义的:余数非 时,它的符号有两种选择,一个是正号而另一个是负号[a]。通常情况下,在数论中总是选择正余数。但在编程中,选择余数的符号依赖于编程语言和被除数 或除数 的符号。在编程语言所定义的整数模除中,ISO/IEC标准Pascal[1]和ALGOL 68[2],在计算出的余数r
为负数时,返回正数 作为结果[b];另一些编程语言如ISO/IEC C90,当被除数 或除数 是负数时,C90标准并没有做具体的规定,而是留给编译器去定义并实现[3]。在大多数系统中 是未定义的,虽然有些系统定义它就等于 。更多详情参见后续章节表格。
- 很多取模的实现都使用了“截断除法”(英语:truncated division),商经由截尾函数来定义,商向零取整,结果等于普通除法所得的小数靠近 方向的第一个整数:
余数和被除数符号一致:
- 高德纳定义的“下取整除法”(英语:floored division)[4],商经由下取整函数来定义,商总是向负无穷取整,即使商已经是负数:
余数和除数符号一致:
- Raymond T. Boute使用的欧几里得除法定义中[5],要求满足 ,在这种情况下:
这里的 是符号函数,余数总是非负数:
- Common Lisp的
round
函数和IEEE 754使用“修约除法”(英语:rounded division),商经由修约函数 (约半成偶)来定义为:当商为偶数时,余数范围是 ;当商为奇数时,余数范围是 :
- Common Lisp的
ceiling
函数使用“上取整除法”(英语:ceiling division),商经由上取整函数定义为:余数与除数有相反的符号:
记号
一些计算器有取模mod()按钮,很多编程语言里也有类似的函数,通常像mod(a, n)
这样。有些语言也支持在表达式内使用%
、mod
或Mod
作为取模或取余操作符,比如a % n
或a mod n
。
在一些没有mod()函数的环境中或许可使用等价的:a - (n * int(a/n))
。这里的int()
函数事实上等价于截断函数。
性质及恒等式
一些取模操作,经过分解和展开可以等同于其他数学运算。这在密码学的证明中十分有用,例如:迪菲-赫尔曼密钥交换。
编程语言实现
语言 | 算符 | 整数 | 浮点数 | 定义 |
---|---|---|---|---|
ABAP | MOD
|
是 | 是 | 欧几里得式 |
ActionScript | %
|
是 | 否 | 截断 |
Ada | mod
|
是 | 否 | 下取整[6] |
rem
|
是 | 否 | 截断[6] | |
ALGOL 68 | ÷× , mod
|
是 | 否 | 类似欧几里得式[c] |
AMPL | mod
|
是 | 否 | 截断 |
APL | | [d]
|
是 | 是 | 下取整 |
AppleScript | mod
|
是 | 否 | 截断 |
AutoLISP | (rem d n)
|
是 | 否 | 截断 |
AWK | %
|
是 | 否 | 截断 |
bash | %
|
是 | 否 | 截断 |
BASIC | Mod
|
是 | 否 | 实现各异 |
bc | %
|
是 | 否 | 截断 |
C C++ |
% , div
|
是 | 否 | 截断[e] |
fmod (C)std::fmod (C++)
|
否 | 是 | 截断[9] | |
remainder (C)std::remainder (C++)
|
否 | 是 | 修约 | |
C# | %
|
是 | 是 | 截断 |
Math.IEEERemainder
|
否 | 是 | 修约[10] | |
Clarion | %
|
是 | 否 | 截断 |
Clean | rem
|
是 | 否 | 截断 |
Clojure | mod
|
是 | 否 | 下取整[11] |
rem
|
是 | 否 | 截断[12] | |
COBOL | FUNCTION MOD
|
是 | 否 | 下取整[13] |
FUNCTION REM
|
是 | 是 | 截断[13] | |
CoffeeScript | %
|
是 | 否 | 截断 |
%%
|
是 | 否 | 下取整[14] | |
ColdFusion | % , MOD
|
是 | 否 | 截断 |
Common Intermediate Language | rem (有符号)
|
是 | 是 | 截断[15] |
rem.un (无符号)
|
是 | 否 | 不适用 | |
Common Lisp | mod
|
是 | 是 | 下取整 |
rem
|
是 | 是 | 截断 | |
Crystal | % , modulo
|
是 | 是 | 下取整 |
remainder
|
是 | 是 | 截断 | |
D | %
|
是 | 是 | 截断[16] |
Dart | %
|
是 | 是 | 欧几里得式[17] |
remainder()
|
是 | 是 | 截断[18] | |
Eiffel | \\
|
是 | 否 | 截断 |
Elixir | rem/2
|
是 | 否 | 截断[19] |
Integer.mod/2
|
是 | 否 | 下取整[20] | |
Elm | modBy
|
是 | 否 | 下取整[21] |
remainderBy
|
是 | 否 | 截断[22] | |
Erlang | rem
|
是 | 否 | 截断 |
math:fmod/2
|
否 | 是 | 截断 (同于C)[23] | |
Euphoria | mod
|
是 | 否 | 下取整 |
remainder
|
是 | 否 | 截断 | |
F# | %
|
是 | 是 | 截断 |
Math.IEEERemainder
|
否 | 是 | 修约[10] | |
Factor | mod
|
是 | 否 | 截断 |
FileMaker | Mod
|
是 | 否 | 下取整 |
Forth | mod
|
是 | 否 | 实现定义 |
fm/mod
|
是 | 否 | 下取整 | |
sm/rem
|
是 | 否 | 截断 | |
Fortran | mod
|
是 | 是 | 截断 |
modulo
|
是 | 是 | 下取整 | |
Frink | mod
|
是 | 否 | 下取整 |
Full BASIC | MOD
|
是 | 是 | 下取整[24] |
REMAINDER
|
是 | 是 | 截断[25] | |
GLSL | %
|
是 | 否 | 未定义[26] |
mod
|
否 | 是 | 下取整[27] | |
GameMaker Studio (GML) | mod , %
|
是 | 否 | 截断 |
GDScript (Godot) | %
|
是 | 否 | 截断 |
fmod
|
否 | 是 | 截断 | |
posmod
|
是 | 否 | 欧几里得式 | |
fposmod
|
否 | 是 | 欧几里得式 | |
Go | %
|
是 | 否 | 截断[28] |
math.Mod
|
否 | 是 | 截断[29] | |
big.Int.Mod
|
是 | 否 | 欧几里得式[30] | |
big.Int.Rem
|
是 | 否 | 截断[31] | |
Groovy | %
|
是 | 否 | 截断 |
Haskell | mod
|
是 | 否 | 下取整[32] |
rem
|
是 | 否 | 截断[32] | |
Data.Fixed.mod' (GHC)
|
否 | 是 | 下取整 | |
Haxe | %
|
是 | 否 | 截断 |
HLSL | %
|
是 | 是 | 未定义[33] |
J | | [d]
|
是 | 否 | 下取整 |
Java | %
|
是 | 是 | 截断 |
Math.floorMod
|
是 | 否 | 下取整 | |
JavaScript TypeScript |
%
|
是 | 是 | 截断 |
Julia | mod
|
是 | 是 | 下取整[34] |
% , rem
|
是 | 是 | 截断[35] | |
Kotlin | % , rem
|
是 | 是 | 截断[36] |
mod
|
是 | 是 | 下取整[37] | |
ksh | %
|
是 | 否 | 截断 (同于POSIX sh) |
fmod
|
否 | 是 | 截断 | |
LabVIEW | mod
|
是 | 是 | 截断 |
LibreOffice | =MOD()
|
是 | 否 | 下取整 |
Logo | MODULO
|
是 | 否 | 下取整 |
REMAINDER
|
是 | 否 | 截断 | |
Lua 5 | %
|
是 | 是 | 下取整 |
Lua 4 | mod(x,y)
|
是 | 是 | 截断 |
Liberty BASIC | MOD
|
是 | 否 | 截断 |
Mathcad | mod(x,y)
|
是 | 否 | 下取整 |
Maple | e mod m (默认), modp(e, m)
|
是 | 否 | 欧几里得式 |
mods(e, m)
|
是 | 否 | 修约 | |
frem(e, m)
|
是 | 是 | 修约 | |
Mathematica | Mod[a, b]
|
是 | 否 | 下取整 |
MATLAB | mod
|
是 | 否 | 下取整 |
rem
|
是 | 否 | 截断 | |
Maxima | mod
|
是 | 否 | 下取整 |
remainder
|
是 | 否 | 截断 | |
Maya Embedded Language | %
|
是 | 否 | 截断 |
Microsoft Excel | =MOD()
|
是 | 是 | 下取整 |
Minitab | MOD
|
是 | 否 | 下取整 |
Modula-2 | MOD
|
是 | 否 | 下取整 |
REM
|
是 | 否 | 截断 | |
MUMPS | #
|
是 | 否 | 下取整 |
Netwide Assembler (NASM, NASMX) | % , div (无符号)
|
是 | 否 | 不适用 |
%% (有符号)
|
是 | 否 | 实现定义[38] | |
Nim | mod
|
是 | 否 | 截断 |
Oberon | MOD
|
是 | 否 | 类似下取整[f] |
Objective-C | %
|
是 | 否 | 截断 (同于C99) |
Object Pascal, Delphi | mod
|
是 | 否 | 截断 |
OCaml | mod
|
是 | 否 | 截断[39] |
mod_float
|
否 | 是 | 截断[40] | |
Occam | \
|
是 | 否 | 截断 |
Pascal (ISO-7185和ISO-10206) | mod
|
是 | 否 | 类似欧几里得式[c] |
Perl | %
|
是 | 否 | 下取整[g] |
POSIX::fmod
|
否 | 是 | 截断 | |
PHP | %
|
是 | 否 | 截断[42] |
fmod
|
否 | 是 | 截断[43] | |
PIC BASIC Pro | \\
|
是 | 否 | 截断 |
PL/I | mod
|
是 | 否 | 下取整 (ANSI PL/I) |
PowerShell | %
|
是 | 否 | 截断 |
Programming Code (PRC) | MATH.OP - 'MOD; (\)'
|
是 | 否 | 未定义 |
Progress | modulo
|
是 | 否 | 截断 |
Prolog (ISO 1995[44]) | mod
|
是 | 否 | 下取整 |
rem
|
是 | 否 | 截断 | |
PureBasic | % , Mod(x,y)
|
是 | 否 | 截断 |
PureScript | `mod`
|
是 | 否 | 欧几里得式[45] |
Pure Data | %
|
是 | 否 | 截断 (同于C) |
mod
|
是 | 否 | 下取整 | |
Python | %
|
是 | 是 | 下取整 |
math.fmod
|
否 | 是 | 截断 | |
math.remainder
|
否 | 是 | 修约 | |
Q# | %
|
是 | 否 | 截断[46] |
R | %%
|
是 | 是 | 下取整[47] |
Racket | modulo
|
是 | 否 | 下取整 |
remainder
|
是 | 否 | 截断 | |
Raku | %
|
否 | 是 | 下取整 |
RealBasic | MOD
|
是 | 否 | 截断 |
Reason | mod
|
是 | 否 | 截断 |
Rexx | //
|
是 | 是 | 截断 |
RPG | %REM
|
是 | 否 | 截断 |
Ruby | % , modulo()
|
是 | 是 | 下取整 |
remainder()
|
是 | 是 | 截断 | |
Rust | %
|
是 | 是 | 截断 |
rem_euclid()
|
是 | 是 | 欧几里得式[48] | |
SAS | MOD
|
是 | 否 | 截断 |
Scala | %
|
是 | 是 | 截断 |
Scheme | modulo
|
是 | 否 | 下取整 |
remainder
|
是 | 否 | 截断 | |
Scheme R6RS | mod
|
是 | 否 | 欧几里得式[49] |
mod0
|
是 | 否 | 修约[49] | |
flmod
|
否 | 是 | 欧几里得式 | |
flmod0
|
否 | 是 | 修约 | |
Scratch | mod
|
是 | 是 | 下取整 |
Seed7 | mod
|
是 | 是 | 下取整 |
rem
|
是 | 是 | 截断 | |
SenseTalk | modulo
|
是 | 否 | 下取整 |
rem
|
是 | 否 | 截断 | |
Unix shell (包括bash、ash等。) | %
|
是 | 否 | 截断 (同于C)[50] |
Smalltalk | \\
|
是 | 否 | 下取整 |
rem:
|
是 | 否 | 截断 | |
Snap! | mod
|
是 | 否 | 下取整 |
Spin | //
|
是 | 否 | 下取整 |
Solidity | %
|
是 | 否 | 下取整 |
SQL (SQL:1999) | mod(x,y)
|
是 | 否 | 截断 |
SQL (SQL:2011) | %
|
是 | 否 | 截断 |
Standard ML | mod
|
是 | 否 | 下取整 |
Int.rem
|
是 | 否 | 截断 | |
Real.rem
|
否 | 是 | 截断 | |
Stata | mod(x,y)
|
是 | 否 | 欧几里得式 |
Swift | %
|
是 | 否 | 截断[51] |
remainder(dividingBy:)
|
否 | 是 | 修约[52] | |
truncatingRemainder(dividingBy:)
|
否 | 是 | 截断[53] | |
Tcl | %
|
是 | 否 | 下取整 |
fmod()
|
否 | 是 | 截断 (同于C) | |
tcsh | %
|
是 | 否 | 截断 |
Torque | %
|
是 | 否 | 截断 |
Turing | mod
|
是 | 否 | 下取整 |
Verilog (2001) | %
|
是 | 否 | 截断 |
VHDL | mod
|
是 | 否 | 下取整 |
rem
|
是 | 否 | 截断 | |
VimL | %
|
是 | 否 | 截断 |
Visual Basic | Mod
|
是 | 否 | 截断 |
WebAssembly | i32.rem_u , i64.rem_u (无符号)
|
是 | 否 | 不适用 |
i32.rem_s , i64.rem_s (有符号)
|
是 | 否 | 截断[54] | |
x86 assembly | DIV (无符号)
|
是 | 否 | 不适用 |
IDIV (有符号)
|
是 | 否 | 截断 | |
XBase++ | %
|
是 | 是 | 截断 |
Mod()
|
是 | 是 | 下取整 | |
Zig | % , @mod , @rem
|
是 | 是 | 截断[55] |
Z3 theorem prover | div , mod
|
是 | 否 | 欧几里得式 |
此外,很多计算机系统提供divmod
功能,它同时产生商和余数。例子x86架构的IDIV
指令,C编程语言的div()
函数,和Python的divmod()
函数。
常见错误
当取模的结果与被除数符号相同时,可能会导致意想不到的错误。
举个例子:如果需要判断一个整数是否为奇数,有人可能会测试这个数除 2 的余数是否为 1:
bool is_odd(int n) {
return n % 2 == 1;
}
但在一个取模结果与被除数符号相同的编程语言里,这样做是错的。因为当被除数 n 是奇数且为负数时, 得到 −1,此时函数返回“假”。
一种正确的实现是测试取模结果是否为 0,因为余数为 0 时没有符号的问题:
bool is_odd(int n) {
return n % 2 != 0;
}
或者考虑余数的符号,有两种情况:余数可能为 1 或 -1。
bool is_odd(int n) {
return n % 2 == 1 || n % 2 == -1;
}
性能问题
可以通过依次计算带余数的除法实现取模操作。特殊情况下,如某些硬件上,存在更快的实现。 例如:2 的 n 次幂的模,可以通过逐位与运算实现:
x % 2n == x & (2n - 1)
例子,假定 x 为正数:
x % 2 == x & 1
x % 4 == x & 3
x % 8 == x & 7
在进行位操作比取模操作效率更高的设备或软件环境中,以上形式的取模运算速度更快。[56]
编译器可以自动识别出对 2 的 n 次幂取模的表达式,自动将其优化为 expression & (constant-1)
。这样可以在兼顾效率的情况下写出更整洁的代码。这个优化在取模结果与被除数符号一致的语言中(包括 C 语言)不能使用,除非被除数是无符号整数。这是因为如果被除数是负数,则结果也是负数,但 expression & (constant-1)
总是正数,进行这样的优化就会导致错误,无符号整数则没有这个问题。
用途
参见
脚注
参考文献
- ^ ISO/IEC 7185, Information Technology—Programming Languages–Pascal. International Standard, 2nd ed. (PDF). ISO/IEC 7185, 1990 (E).
A term of the formi div j
shall be an error ifj
is zero; otherwise, the value ofi div j
shall be such that
abs(i) - abs(j) < abs((i div j) * j) <= abs(i)
abs(i) < abs(j)
; otherwise, the sign of the value shall be positive ifi
andj
have the same sign and negative ifi
andj
have different signs.
A term of the formi mod j
shall be an error ifj
is zero or negative; otherwise, the value ofi mod j
shall be that value of(i - (k * j))
for integralk
such that0 <= i mod j < j
.
NOTE 2 — Only fori >= 0
andj > 0
does the relation(i div j) * j + i mod j = i
hold.
Kathleen Jensen, Niklaus Wirth. PASCAL User Manual and Report - ISO Pascal Standard (PDF). 1991.
div
divide and truncate (i.e., value is not rounded) mod
modulus: let Remainder = A - (A div B) * B
;
ifRemainder < 0
thenA mod B = Remainder + B
otherwise
A mod B = Remainder
- ^ A. van Wijngaarden, B. J. Mailloux, J. E. L. Peck, C. H. A. Koster, M. Sintzoff, C. H. Lindsey, L. G. L.T. Meertens and R. G. Fisker. Revised Report on the Algorithmic Language Algol 68. IFIP W.G. 2.1.
10.2.3.3. Operations on integral operands
……
m) OP «÷, %, OVER» = (L INT a, b) L INT: IF b ≠ L 0 THEN L INT q := L 0, r := ABS a; WHILE (r := r - ABS b) ≥ L 0 DO q := q + L 1 OD; (a < L 0 AND b > L 0 OR a ≥ L 0 AND b < L 0 | -q | q) FI; n) OP «÷×, ÷*, %*, MOD» = (L INT a, b) L INT: (L INT r = a - a ÷ b × b; r < 0 | r + ABS b | r);
- ^ Jones, Derek M. The New C Standard: An Economic and Cultural Commentary (PDF). Addison-Wesley. 2003 [2018-07-11]. ISBN 9780201709179. (原始内容 (PDF)存档于2018-07-11) (英语).
C99 reflects almost universal processor behavior (as does the Fortran Standard). This definition truncates toward zero and the expression(-(a/b) == (-a)/b) && (-(a/b) == a/(-b))
is always true. It also means that the absolute value of the result does not depend on the signs of the operands; for example:
+10 / +3 == +3
+10 % +3 == +1
-10 / +3 == -3
-10 % +3 == -1
+10 / -3 == -3
+10 % -3 == +1
-10 / -3 == +3
-10 % -3 == -1
- When integers are divided and the division is inexact, if both operands are positive the result of the
/
operator is the largest integer less than the algebraic quotient and the result of the%
operator is positive. If either operand is negative, whether the result of the/
operator is the largest integer less than or equal to the algebraic quotient or the smallest integer greater than or equal to the algebraic quotient is implementation-defined, as is the sign of the result of the%
operator.
#include <stdio.h> int main(void) { int x = -1, y = +3; if ((x%y > 0) || ((x+y)%y == x%y)) printf("This is a C90 translator behaving differently than C99\n"); }
- The origin of this practice seems to have been a desire to map C’s division directly to the “natural” behavior of the target instruction set, whatever it may be, without requiring extra code overhead that might be necessary to check for special cases and enforce a particular behavior. However, the argument that Fortran programmers are unpleasantly surprised by this aspect of C and that there would be negligible impact on code efficiency was accepted by WG14, who agreed to require Fortran-like behavior in C99.
- ^ Knuth, Donald. E. The Art of Computer Programming. Addison-Wesley. 1972 (英语).
If is any real number, we write
- = the greatest integer less than or equal to (the floor of );
- = the least integer greater than or equal to (the ceiling of ).
The following formulas and examples are easily verified:
……
if and only if is an integer, if and only if is not an integer; ; .
……
If and are any real numbers, we define the following binary operation:
- ; . (1)
From this definition we can see that, when ,
- . (2)
Consequently
a) if , then ;
b) if , then ;
c) the quantity is an integral multiple of .
We call the remainder when is divided by ; similarly, we call the quotient.
When and are integers, “ ” is therefore a familiar operation:
- , , . (3)
We have if and only if is a multiple of , that is, if and only if is divisible by . The notation , read “ divides ,” means that is a positive integer and .
The “ ” operation is useful also when and take arbitrary real values. For example, with trigonometric functions we can write
- .
The quantity is the fractional part of ; we have, by Eq. (1),
- .
- = the greatest integer less than or equal to (the floor of );
- ^ Boute, Raymond T. The Euclidean definition of the functions div and mod. ACM Transactions on Programming Languages and Systems (ACM Press (New York, NY, USA)). April 1992, 14 (2): 127–144. doi:10.1145/128861.128862 (英语).
Let us recall Euclid’s theorem.
- THEOREM. For any real numbers and with , there exists a unique pair of numbers satisfying the following conditions:
- (a) ;
- (b) ;
- (c) .
With the notational conventions of the theorem, we define and . Clearly the correspondingly labeled conditions are satisfied.
Properties
- THEOREM. For any real numbers and with , there exists a unique pair of numbers satisfying the following conditions:
- ^ 6.0 6.1 ISO/IEC 8652:2012 - Information technology — Programming languages — Ada. ISO, IEC. 2012. sec. 4.5.5 Multiplying Operators.
- ^ C99 specification (ISO/IEC 9899:TC2) (PDF). sec. 6.5.5 Multiplicative operators. 2005-05-06 [16 August 2018].
- ^ ISO/IEC 14882:2003: Programming languages – C++. International Organization for Standardization (ISO), International Electrotechnical Commission (IEC). 2003. sec. 5.6.4.
the binary % operator yields the remainder from the division of the first expression by the second. .... If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined
- ^ ISO/IEC 9899:1990: Programming languages – C. ISO, IEC. 1990. sec. 7.5.6.4.
The fmod function returns the value x - i * y, for some integer i such that, if y is nonzero, the result has the same sign as x and magnitude less than the magnitude of y.
- ^ 10.0 10.1 dotnet-bot. Math.IEEERemainder(Double, Double) Method (System). Microsoft Learn. [2022-10-04] (美国英语).
- ^ clojure.core - Clojure v1.10.3 API documentation. clojure.github.io. [2022-03-16].
- ^ clojure.core - Clojure v1.10.3 API documentation. clojure.github.io. [2022-03-16].
- ^ 13.0 13.1 ISO/IEC JTC 1/SC 22/WG 4. ISO/IEC 1989:2023 – Programming language COBOL . ISO. January 2023.
- ^ CoffeeScript operators
- ^ ISO/IEC JTC 1/SC 22. ISO/IEC 23271:2012 — Information technology — Common Language Infrastructure (CLI). ISO. February 2012. §§ III.3.55–56.
- ^ Expressions - D Programming Language. dlang.org. [2021-06-01].
- ^ operator % method - num class - dart:core library - Dart API. api.dart.dev. [2021-06-01].
- ^ remainder method - num class - dart:core library - Dart API. api.dart.dev. [2021-06-01].
- ^ Kernel — Elixir v1.11.3. hexdocs.pm. [2021-01-28].
- ^ Integer — Elixir v1.11.3. hexdocs.pm. [2021-01-28].
- ^ Basics - core 1.0.5. package.elm-lang.org. [2022-03-16].
- ^ Basics - core 1.0.5. package.elm-lang.org. [2022-03-16].
- ^ Erlang -- math. erlang.org. [2021-06-01].
- ^ ANSI. Programming Languages — Full BASIC. New York: American National Standards Institute. 28 January 1987. § 5.4.4.
X modulo Y, i.e., X-Y*INT(X/Y).
- ^ ANSI. Programming Languages — Full BASIC. New York: American National Standards Institute. 28 January 1987. § 5.4.4.
The remainder function, i.e., X-Y*IP(X/Y).
- ^ GLSL Language Specification, Version 4.50.7 (PDF). section 5.9 Expressions.
If both operands are non-negative, then the remainder is non-negative. Results are undefined if one or both operands are negative.
- ^ GLSL Language Specification, Version 4.50.7 (PDF). section 8.3 Common Functions.
- ^ The Go Programming Language Specification - The Go Programming Language. go.dev. [2022-02-28].
- ^ math package - math - pkg.go.dev. pkg.go.dev. [2022-02-28].
- ^ big package - math/big - pkg.go.dev. pkg.go.dev. [2022-02-28].
- ^ big package - math/big - pkg.go.dev. pkg.go.dev. [2024-04-12].
- ^ 32.0 32.1 6 Predefined Types and Classes. www.haskell.org. [2022-05-22].
- ^ Operators. Microsoft. [2021-07-19].
The % operator is defined only in cases where either both sides are positive or both sides are negative. Unlike C, it also operates on floating-point data types, as well as integers.
- ^ Mathematics · The Julia Language. docs.julialang.org. [2021-11-20].
- ^ Mathematics · The Julia Language. docs.julialang.org. [2021-11-20].
- ^ rem - Kotlin Programming Language. Kotlin. [2021-05-05] (英语).
- ^ mod - Kotlin Programming Language. Kotlin. [2021-05-05] (英语).
- ^ Chapter 3: The NASM Language. NASM - The Netwide Assembler version 2.15.05.
- ^ OCaml library : Stdlib. ocaml.org. [2022-02-19].
- ^ OCaml library : Stdlib. ocaml.org. [2022-02-19].
- ^ Perl documentation
- ^ PHP: Arithmetic Operators - Manual. www.php.net. [2021-11-20].
- ^ PHP: fmod - Manual. www.php.net. [2021-11-20].
- ^ ISO 1995
- ^ EuclideanRing.
- ^ QuantumWriter. Expressions. docs.microsoft.com. [2018-07-11] (美国英语).
- ^ R: Arithmetic Operators. search.r-project.org. [2022-12-24].
- ^ F32 - Rust.
- ^ 49.0 49.1 r6rs.org
- ^ Shell Command Language. pubs.opengroup.org. [2021-02-05].
- ^ Apple Developer Documentation. developer.apple.com. [2021-11-20].
- ^ Apple Developer Documentation. developer.apple.com. [2021-11-20].
- ^ Apple Developer Documentation. developer.apple.com. [2021-11-20].
- ^ Rossberg, Andreas (编). WebAssembly Core Specification: Version 2.0. World Wide Web Consortium. § 4.3.2 Integer Operations. 19 April 2022.
- ^ Zig Documentation. Zig Programming Language. [2022-12-18].
- ^ Horvath, Adam. Faster division and modulo operation - the power of two. July 5, 2012. (原始内容存档于2018-03-05) (英语).