相关疑难解决方法(0)

Fortran 90种参数

我无法理解Fortran 90的kind参数.据我所知,它不确定变量的精度(即浮点数或双精度数),也不确定变量的类型.

那么,它决定了什么,究竟是什么呢?

fortran

36
推荐指数
3
解决办法
5万
查看次数

"真正的*8"是什么意思?

用Fortran 90编写的程序手册说:"所有实际变量和参数都以64位精度(即real*8)指定."

根据维基百科,单精度对应于32位精度,而双精度对应于64位精度,因此显然程序使用双精度.

但是什么real*8意思呢?

我认为这8意味着8位数字跟随小数点.然而,维基百科似乎说单精度通常提供6-9位数,而双精度通常提供15-17位数.这是否意味着语句"64位精度"与real*8?不一致?

precision fortran bit fortran90

28
推荐指数
3
解决办法
5万
查看次数

使用双冒号声明变量时是否有区别

声明变量时使用双冒号有区别吗?

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)

但除此之外,只是声明一个普通的旧的realinteger没有属性而不是初始化是否有任何区别?

此外,这与SAVE属性有关吗?在我的一些代码中有一段时间出现意外行为,我在调用之间保存函数的结果,这迫使我每次调用函数时显式地将变量设置为零,即使该SAVE属性不是由我设置的.

fortran fortran90

13
推荐指数
1
解决办法
3903
查看次数

Fortran:最大和最小的整数

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.

  1. 为什么每种类型的每个最大整数都相同:2147483647?并且是否存在最小整数的内在函数?

  2. 在调用子程序时如何保留整数种类rang?我认为这是最大整数的关键.

fortran fortran95

11
推荐指数
1
解决办法
3万
查看次数

与其他语言相比,Fortran对数值准确性有固有限制吗?

在进行简单的编程练习时,我创建了一个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)

perl fortran floating-accuracy double-precision

5
推荐指数
2
解决办法
2112
查看次数

Fortran的长期投注

我正在尝试使用大数(~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 loops largenumber

4
推荐指数
2
解决办法
5166
查看次数

Fortran中的变量类型

我有一段Fortran代码,我的Fortran编辑器(Force 2.0.9)无法理解该代码中的以下行.

real(kr8) :: rnum
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于这种变量声明的内容.(kr8)是什么意思?如果有人能向我解释,我真的很感激?

variables fortran

3
推荐指数
1
解决办法
456
查看次数

错误:逻辑运算符“.eq.”的操作数 (1) 处为 INTEGER(4)/HOLLERITH

我是 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 gfortran fortran77

3
推荐指数
1
解决办法
3642
查看次数

Fortran中实数的精确问题

我一直在尝试使用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的输出与我指定的值不完全相同,我能做些什么才能使它完全相同?

precision fortran gfortran real-datatype

2
推荐指数
1
解决办法
7236
查看次数

代码指定的双精度和编译器选项双精度之间的差异

编写Fortran代码时,通过赋值声明实数变量,kind=8或者double precision是确保双精度的一种方法.另一种方法是不在代码中明确声明任何内容,而是使用编译器选项,即-r8(ifort)等.

这两者有区别吗?

precision fortran

2
推荐指数
1
解决办法
350
查看次数