我无法理解Fortran 90的kind参数.据我所知,它不确定变量的精度(即浮点数或双精度数),也不确定变量的类型.
那么,它决定了什么,究竟是什么呢?
声明变量时使用双冒号有区别吗?
real(8) :: a
real(8) b
Run Code Online (Sandbox Code Playgroud)
这两个显然都做同样的事情.这些除了风格之间有什么区别吗?
我知道我们可以初始化变量并添加属性,如下所示
real(8), intent(in), parameter :: a = 4, b = 2
Run Code Online (Sandbox Code Playgroud)
但除此之外,只是声明一个普通的旧的real或integer没有属性而不是初始化是否有任何区别?
此外,这与SAVE属性有关吗?在我的一些代码中有一段时间出现意外行为,我在调用之间保存函数的结果,这迫使我每次调用函数时显式地将变量设置为零,即使该SAVE属性不是由我设置的.
Fortran对我来说是全新的,有人可以帮我解决以下问题吗?我想知道我的电脑上每种类型的所有整数类型数字以及最大和最小值.我的代码如下:
program intkind
implicit none
integer :: n=1
integer :: integer_range =1
do while(integer_range /= -1)
print*, "kind_number ", selected_int_kind(n)
call rang(integer_range)
n = n *2
integer_range = selected_int_kind(n)
end do
contains
subroutine rang(largest)
integer largest
print*, huge(largest)
end subroutine
end
Run Code Online (Sandbox Code Playgroud)
我得到的整数类型数字是:1,2,4,8.
为什么每种类型的每个最大整数都相同:2147483647?并且是否存在最小整数的内在函数?
在调用子程序时如何保留整数种类rang?我认为这是最大整数的关键.
在进行简单的编程练习时,我创建了一个while循环(Fortran中的DO循环),当一个实变量达到精确值时,它就会退出.
我注意到由于使用的精度,从未满足相等性并且循环变得无限.当然,这并不是闻所未闻的,并且建议不要将两个数字进行相等比较,最好看两个数字之间的绝对差值是否小于设定的阈值.
我发现令人失望的是我必须设置这个阈值,即使变量是双精度,我的循环也能正常退出.此外,当我在Perl中重写了这个循环的"蒸馏"版本时,我没有数值精度的问题,并且循环退出很好.
由于产生问题的代码非常小,在Perl和Fortran中,我想在这里重现它,以防我对一个重要的细节进行掩饰:
Fortran代码
PROGRAM precision_test
IMPLICIT NONE
! Data Dictionary
INTEGER :: count = 0 ! Number of times the loop has iterated
REAL(KIND=8) :: velocity
REAL(KIND=8), PARAMETER :: MACH_2_METERS_PER_SEC = 340.0
velocity = 0.5 * MACH_2_METERS_PER_SEC ! Initial Velocity
DO
WRITE (*, 300) velocity
300 FORMAT (F20.8)
IF (count == 50) EXIT
IF (velocity == 5.0 * MACH_2_METERS_PER_SEC) EXIT
! IF (abs(velocity - (5.0 * MACH_2_METERS_PER_SEC)) < 1E-4) EXIT
velocity = velocity + 0.1 * MACH_2_METERS_PER_SEC
count …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用大数(~10 ^ 14),我需要能够存储它们并迭代那个长度的循环,即
n=SOME_BIG_NUMBER
do i=n,1,-1
Run Code Online (Sandbox Code Playgroud)
我尝试了通常的星形符号kind=8等,但似乎没有任何效果.然后我检查了huge内在函数和代码:
program inttest
print *,huge(1)
print *,huge(2)
print *,huge(4)
print *,huge(8)
print *,huge(16)
print *,huge(32)
end program inttest
Run Code Online (Sandbox Code Playgroud)
在所有情况下产生数字2147483647.为什么是这样?我在64位机器上使用gfortran(f95).
如果我需要一个bignum图书馆,人们会建议哪一个?
我有一段Fortran代码,我的Fortran编辑器(Force 2.0.9)无法理解该代码中的以下行.
real(kr8) :: rnum
Run Code Online (Sandbox Code Playgroud)
我找不到任何关于这种变量声明的内容.(kr8)是什么意思?如果有人能向我解释,我真的很感激?
我是 Fortran 新手。所以我需要帮助。我在 SUSE 上使用 gfortran 编译我的代码并收到以下错误:
200 IF ( ID .EQ. 4HEOT ) GO TO 20
1
Error: Operands of logical operator '.eq.' at (1) are INTEGER(4)/HOLLERITH
Run Code Online (Sandbox Code Playgroud)
代码的主文件附加在下面的链接中,其中 1818 行显示了错误。
我的文件的链接是:https://files.engineering.com/getfile.aspx? folder=cd6961f3-d38b-4e61-a43d-269fa18c7d11&file=sfeng.f
如何解决这个问题?
对于简化/最小的示例,我在此处添加了代码:
SUBROUTINE CDRD ( II )
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
c ohad 15/7/08
c IMPLICIT INTEGER*8 (I-N)
IMPLICIT INTEGER*4 (I-N)
C*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=C
C THIS SUBROUTINE READS PROPULSION SYSTEM DRAG DATA. C
C C
C USE NON-ZERO "II" TO WRITE TABLE DATA. C
C*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=C
CHARACTER*80 TITLE, CDFILE …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用Fortran作为我的研究项目,使用GNU Fortran编译器(gfortran),最新版本,但我在处理实数时遇到了一些问题.如果您有代码:
program test
implicit none
real :: y = 23.234, z
z = y * 100000
write(*,*) y, z
end program
Run Code Online (Sandbox Code Playgroud)
你会得到输出:
23.23999 2323400.0
Run Code Online (Sandbox Code Playgroud)
我发现这很奇怪.有人能告诉我这里到底发生了什么吗?看看z我可以看到y确实保留了它的精度,所以对于我认为应该不成问题的计算.但是为什么y的输出与我指定的值不完全相同,我能做些什么才能使它完全相同?
编写Fortran代码时,通过赋值声明实数变量,kind=8或者double precision是确保双精度的一种方法.另一种方法是不在代码中明确声明任何内容,而是使用编译器选项,即-r8(ifort)等.
这两者有区别吗?