Fortran标准库系列:MOD vs MODULO
08/10
本文最后更新于
2024年08月10日,已超过
203天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
取余运算 vs 取模运算
- 取余运算(remainder)在计算商时,会将商向0方向舍入。这意味着取余运算尽可能让余数的绝对值最小。
- 取模运算(modulus)在计算商时,会将商向负无穷方向舍入。取模运算尽可能让商的值最小。
当两个数都是正数时,取余运算和取模运算的结果是一样的,因为它们的商都是向0方向舍入的。然而,当两个数符号不同时,取余运算和取模运算的结果会不同。
Fortran标准提供取余函数MOD
和取模函数MODULO
。
MOD函数
计算A除以P的余数。
R=MOD(A,P)
参数A是INTEGER或者REAL类型的标量。参数P必须与A相同类型和精度,不能为0。
函数返回结果是$A-(INT(A/P)* P)$ ,返回值R符号与参数A相同,且$|R|<|P|$。
MODULO
计算A对P取模结果。
R=MODULO(A,P)
参数A是INTEGER或REAL类型的标量。参数P必须与A相同类型和精度,。
返回结果类型和精度与参数相同,且返回值R符号与P相同,且$|R|<|P|$。。
如果A和P是INTEGER类型,返回结果R满足$A=Q*P+R$ ,其中Q是一个整数,$R\in [0,P)$ 。
如果A和P是REAL类型,返回结果$A-FLOOR(A/P)*P$。
区别
两者区别:当参数A和P都为正数时,mod
和modulo
计算结果相同,但当参数有负数时,两者结果不同。
- MOD(A,P) 返回结果符号与A相同。
- MODULO(A,P) 返回结果符号与P相同。
print*, mod(17,3) ! 2
print*, mod(-17,3) ! -2
print*, mod(17,-3) ! 2
print*, mod(-17,-3) ! -2
print*, mod(17.,3.) ! 2.00000000
print*, modulo(17,3) ! 2
print*, modulo(-17,3) ! 1 注意这里与mod(-17,3)结果不同
print*, modulo(17,-3) ! -1 注意这里与mod(17,-3)结果不同
print*, modulo(-17,-3) ! -2
print*, modulo(17.,3.) ! 2.00000000
C和Python情况
- C语言运算符
%
行为与Fortran的取余函数MOD
相同。
#include <stdio.h>
int main(void) {
printf(" 17 % 3 = %d\n", 17 % 3);
printf("-17 % 3 = %d\n", -17 % 3);
printf(" 17 % -3 = %d\n", 17 % -3);
printf("-17 % -3 = %d\n", -17 % -3);
return 0;
}
执行结果:
17 % 3 = 2
-17 % 3 = -2
17 % -3 = 2
-17 % -3 = -2
- Python
Python运算符%
行为与Fortran的取模函数MODULO
相同。
#!/usr/bin/env python
print(" 17 % 3 = ", 17 % 3)
print("-17 % 3 = ", -17 % 3)
print(" 17 % -3 = ", 17 % -3)
print("-17 % -3 = ", -17 % -3)
执行结果:
17 % 3 = 2
-17 % 3 = 1
17 % -3 = -1
-17 % -3 = -2
参考资料

