找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4712|回复: 5

【Fortran、Python、C】取余数计算过程

[复制链接]

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
发表于 2020-8-3 10:38:40 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 watermelon 于 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求余过程中的计算方法,如下图所示:
QQ图片20200803100540.png
对于mod函数的计算方法,是非常的清晰明了了。
接下来看看Fortran和Python以及C语言中的取余数过程:
实验平台:win10 x64, Intel Visual Fortran2013学生版, Visual Studio 2013 Community, Python3.8(CPython)
Fortran实验代码:
    program main
    implicit none
        write(*, *) mod(139, 10)    ! 139 - 10*(int(139 // 10)) => 139 - 10*int(13.9) => 139 - 130 = 9
        write(*, *) mod(139, -10)   ! 139 - (-10)*(int(139 // -10) => 139 + 10*int(-13.9) => 139 + (-130) = 9
        write(*, *) mod(-139, 10)   ! -139 - 10*(int(-139 // 10)) => -139 - 10*int(-13.9) => -139 + 130 = -9
        write(*, *) mod(-139, -10)  ! -139 - (-10)*(int(-139 // -10)) => -139 - (-10)*(int(13.9)) => -139 + 130 = -9
    end program
运行结果:
           9
           9
          -9
          -9
请按任意键继续. . .
依据代码的计算过程,我们可以看出,Fortran在取余的计算过程中使用int()进行取整数时,实现的是正数负数均向0取整的计算方法。
接下来我们继续看一下python3.8中对于取余数的计算方法:
Python实验代码:
  1. print(139 % 10)   # 139 - 10*(int(139 // 10)) => 139 - 10*int(13.9) => 139 - 130 = 9
  2. print(139 % -10)  # 139 - (-10)*(int(139 // -10) => 139 + 10*int(-13.9) => 139 + (-140) = -1
  3. print(-139 % 10)  # -139 - 10*(int(-139 // 10)) => -139 - 10*int(-13.9) => -139 + 140 = 1
  4. print(-139 % -10) # -139 - (-10)*(int(-139 // -10)) => -139 - (-10)*(int(13.9)) => -139 + 130 = -9
复制代码

运行结果:
  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.
  3. >>>
  4. ================ RESTART: C:/Users/Administrator/Desktop/fuck.py ===============
  5. 9
  6. -1
  7. 1
  8. -9
  9. >>>
复制代码

依据代码的计算过程,我们可以看出,Python在取余的计算过程中使用int()进行取整数时,计算方法为:向下取整;即正数向0取整,负数向负无穷取整。
C语言代码与Fortran代码计算结果相同
实验程序如下所示:
  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.         printf("%d\n", 139 % 10);
  5.         printf("%d\n", 139 % -10);
  6.         printf("%d\n", -139 % 10);
  7.         printf("%d\n", -139 % -10);
  8.         return 0;
  9. }
复制代码

运行结果:
  1. 9
  2. 9
  3. -9
  4. -9
  5. 请按任意键继续. . .
复制代码

所以C语言在求余数的方法上与Fortran是相同的。
需要注意的地方是:Fortran中使用int( ),C语言中使用(int)( ),Python中使用int( )对正数与负数取整时,均采用的是向0取整;很明显Python在取余过程中,其计算方法在负数方面发生了改变,成为了向负无穷取整。

希望大家多多批评指正!
Passion Coding!
回复

使用道具 举报

0

主题

48

回帖

69

积分

用户组: 小·技术宅

UID
8099
精华
0
威望
2 点
宅币
17 个
贡献
0 次
宅之契约
0 份
在线时间
9 小时
注册时间
2022-10-22
发表于 2022-11-18 16:25:05 | 显示全部楼层
竟然有Fortran,惊喜嗄
回复 赞! 1 靠! 0

使用道具 举报

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
 楼主| 发表于 2020-8-3 10:45:20 | 显示全部楼层
论坛里面居然没有Fortran语言的代码格式工具,精Fo泪目。
Passion Coding!
回复 赞! 靠!

使用道具 举报

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
 楼主| 发表于 2020-8-3 10:46:37 | 显示全部楼层
本帖同步发布于fcoder论坛:http://bbs.fcode.cn/space-uid-4863.html
Passion Coding!
回复 赞! 靠!

使用道具 举报

29

主题

315

回帖

1561

积分

用户组: 上·技术宅

UID
3808
精华
11
威望
105 点
宅币
702 个
贡献
165 次
宅之契约
0 份
在线时间
404 小时
注册时间
2018-5-6
 楼主| 发表于 2022-11-20 18:23:16 | 显示全部楼层
imr2013 发表于 2022-11-18 16:25
竟然有Fortran,惊喜嗄

是的没错,我目前还在使用Fortran开展一些纯计算任务的程序的编写。
Passion Coding!
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-27 12:06 , Processed in 0.042499 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表