|
本帖最后由 watermelon818 于 2020-8-3 10:53 编辑
昨天群里面有同学讨论求余数的计算问题,Fortran中有专门的求余数函数mod和modulo,其中,两个函数说明如下:(参考资料《Fortran95程序设计》 彭国伦 著)
MOD(a, b)
a, b = INTEGER / REAL
return = INTEGER / REAL
功能:计算a/b余数。当参数为浮点数时,返回(a-int(a/b)*b)的值
MODULO(a, b)
a, b = INTEGER / REAL
RETURN = INTEGER / REAL
功能:同样计算a/b的余数,使用和MOD不同的公式来计算。当参数为整数时,返回a-FLOOR(REAL(a)/REAL(b))*b, 参数为浮点数时,返回a - FLOOR(a/b)*b
小弟主要讨论一下对整数的求余方法的计算过程,抛砖引玉,希望有老师们多多批评指正!
之前max同学在群里发送过一个图片,显示了Fortran求余过程中的计算方法,如下图所示:
对于mod函数的计算方法,是非常的清晰明了了。
接下来看看Fortran和Python以及C语言中的取余数过程:
实验平台:win10 x64, Intel Visual Fortran2013学生版, Visual Studio 2013 Community, Python3.8(CPython)
Fortran实验代码:
[Fortran] 纯文本查看 复制代码 3 | write ( * , * ) mod ( 139 , 10 ) |
4 | write ( * , * ) mod ( 139 , -10 ) |
5 | write ( * , * ) mod ( -139 , 10 ) |
6 | write ( * , * ) mod ( -139 , -10 ) |
运行结果:
依据代码的计算过程,我们可以看出,Fortran在取余的计算过程中使用int()进行取整数时,实现的是正数负数均向0取整的计算方法。
接下来我们继续看一下python3.8中对于取余数的计算方法:
Python实验代码:
运行结果:
[Python] 纯文本查看 复制代码 1 | Python 3.8 . 1 (tags / v3. 8.1 : 1b293b6 , Dec 18 2019 , 23 : 11 : 46 ) [MSC v. 1916 64 bit (AMD64)] on win32 |
2 | Type "help" , "copyright" , "credits" or "license()" for more information. |
4 | = = = = = = = = = = = = = = = = RESTART: C: / Users / Administrator / Desktop / fuck.py = = = = = = = = = = = = = = = |
依据代码的计算过程,我们可以看出,Python在取余的计算过程中使用int()进行取整数时,计算方法为:向下取整;即正数向0取整,负数向负无穷取整。
C语言代码与Fortran代码计算结果相同
实验程序如下所示:
[C] 纯文本查看 复制代码 2 | int main( int argc, char *argv[]) |
4 | printf ( "%d\n" , 139 % 10); |
5 | printf ( "%d\n" , 139 % -10); |
6 | printf ( "%d\n" , -139 % 10); |
7 | printf ( "%d\n" , -139 % -10); |
运行结果:
所以C语言在求余数的方法上与Fortran是相同的。
需要注意的地方是:Fortran中使用int( ),C语言中使用(int)( ),Python中使用int( )对正数与负数取整时,均采用的是向0取整;很明显Python在取余过程中,其计算方法在负数方面发生了改变,成为了向负无穷取整。
希望大家多多批评指正!
|
|