random - 如何制作fortran随机数
问题描述
我想在不使用函数的情况下制作 rand 数
PROGRAM RTEST
PARAMETER (N=100)
IMPLICIT REAL(A-H,O-Z), INTEGER(I-N)
DIMENSION A(N)
OPEN(99,FILE='RANDOM.DAT',FORM='FORMATTED')
IBMO=3149
SUM=0.0
DO 5 I=1,N
IBMO=IBMO*65549
IF(IBMO) 101, 102, 102
101 IBMO=IBMO+2147483647+1
102 RANDOM=0.46566128E-9*IBMO
A(I)=RANDOM
WRITE(99,10)I,A(I)
WRITE(6,10) I,A(I)
10 FORMAT(5X,I4,3X,F12.7)
SUM=SUM+A(I)
AVE1=SUM/FLOAT(N)
20 FORMAT(12X,F12.7)
30 FORMAT(5X,I4,3X,F12.7)
WRITE(6,20) AVE1
WRITE(99,30)I,AVE1
5 CONTINUE
CLOSE(99)
AVE=SUM/FLOAT(N)
WRITE(6,*)AVE
PAUSE
STOP
END
但我总是遇到整数溢出或无效浮点错误.....
所以我认为是类型错误
我试着改变real
>>real*8
和integer
>>integer*8
但每次尝试都失败了......
什么是问题?
解决方案
您的问题是您甚至需要常量才能具有特定类型。这是您需要做的:
PROGRAM RTEST
USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY: int64, real64
IMPLICIT NONE
INTEGER, PARAMETER :: N = 100
REAL(KIND=real64) :: A(N)
INTEGER(KIND=int64) :: IBMO
...
IBMO = IBMO * 65549_int64
IBMO = IBMO + 2147483648_int64
等等。附加的_int64
(在您从iso_fortran_env
模块中导入它之后)告诉编译器将此数字视为 64 位整数。除了线use, intrinsic :: iso_fortran_env
,您还可以使用线
INTEGER, PARAMETER :: int64 = selected_int_kind(19)
INTEGER, PARAMETER :: real64 = selected_real_kind(r=300)
(IMPLICIT NONE
当然,在 之后。)
也就是说,您使用这种过时的 Fortran 语法是否有原因?
任何不包含该行的 Fortran 程序implicit none
都是可疑的。然后你使用语法
do 5 i = 1, n
...
5 continue
有什么问题
do i = 1, n
...
end do
接着
if (ibmo) 101, 102, 102
那是我什至不认识的语法。
推荐阅读
- javascript - 在新选项卡中打开 URL 并设置输入值
- django-models - DRF created_by updated_by 在迁移期间失败
- intellij-idea - 无法在 IntelliJ 中启动微服务导致 h2 Web 控制台
- sdk - Genexus Extensions SDK - 如何为 Genexus Server 开发扩展?
- android - 如何使用 Flutter 创建自定义 3D 框?
- python - 如何将 cv2 矩形边界框合并为多边形?(不是重叠/阈值)
- javascript - Javascript - 在特定网站上多次注入代码
- amazon-web-services - s3 从 s3 存储桶前缀中检索所有删除标记版本
- java - Jakarta EE 兼容的应用程序服务器版本
- python - 我想用假人做一个链表但是为什么代码是反向打印的!!。这是我的代码