Fortran:可能的价值变化

Fortran:可能的价值变化,fortran,gfortran,Fortran,Gfortran,我有一个用gfortran编译的fortran代码(几千行,因此我将尝试发布重要的行),它给了我: nrev(isat)=dint((t_ref-t_in)/zper)+1 1 Warning:Possible change of value in conversion from REAL(8) to INTEGER(4) at (1) 它们初始化为: integer*4 nrev(nmaxsat) integer*4 isat real*8 t_ref re

我有一个用gfortran编译的fortran代码(几千行,因此我将尝试发布重要的行),它给了我:

nrev(isat)=dint((t_ref-t_in)/zper)+1
           1
Warning:Possible change of value in conversion from REAL(8) to INTEGER(4) at (1)
它们初始化为:

integer*4  nrev(nmaxsat)
integer*4  isat
real*8     t_ref
real*8     t_in
real*8     zper
有没有办法解决这个问题?
谢谢

消除所有警告是一个很好的主意,即使是很小的警告——即使只有这样,当你遇到更重要的问题时,你才能看到它们,而不是让输出被小事淹没

在这种情况下,警告信息相当清楚;将双精度赋值给整数。
内在截断,但不转换类型;因此,您正在分配一个双精度值,该值被截断为整数。您可以正确地注意到,内在的名称令人困惑,但是

如果您想进行转换和截断,那么,
idit
实际上会转换为整数

比如这个节目

program foo

    integer :: nrev
    double precision :: t_ref

    t_ref  = 1.

    nrev = dint(t_ref)

end program foo
创建相同的警告:

$ gfortran -o foo foo.f90 -Wall -std=f95
foo.f90:8.11:

    nrev = dint(t_ref)
           1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1)
但这个很好:

program foo

    integer :: nrev
    double precision :: t_ref

    t_ref  = 1.

    nrev = idint(t_ref)

end program foo
正如我们看到的:

$ gfortran -o foo foo.f90 -Wall -std=f95
$ 

你到底想修什么?根据双精度表达式的大小,它不能表示为32位有符号整数。你期望发生什么?当我运行完整的程序时,所有的输出值都是NaN,所以我担心像这样的警告是问题所在。我在gfortran中编译时没有错误,但是在g77中编译时它可以正确编译和运行。我有几个这样的警告,但我把重点放在这一个,希望如果我能得到帮助,我可以找出其余的。如果你得到的是NaN值,这意味着你有一个无效的浮点计算某处。您显示的代码正在计算一个整数值。根据你所发布的内容,很难说这两者之间有什么联系。我对编程非常陌生,对Fortran也完全陌生……你所说的无效浮点是什么意思?这可能是由77国集团向gfortran的版本变更引起的吗?在我思考这个问题的时候,你知道“转换中可能的值变化”和“参数中的类型不匹配”警告之间的区别吗?他们似乎用两种不同的方式说同一件事。。。再次感谢!无效是指在您使用的浮点类型范围内不能表示为实数的操作。通常的罪魁祸首是被零除,取负实值的对数或平方根。另一种可能是使用一个值而不给它赋值。有些编译器会自动将值归零,有些则不会。该标准没有定义是否需要隐式初始化值。您可以使用通用名称“int”,而不是使用特定的内在“idit”。使用泛型,编译器会根据参数的类型自动确定要使用哪个函数&程序员不必记住名称。(还有第二个参数,您可以在其中指定函数返回的整数的类型。)非常感谢您的解释!这将帮助我清理这段代码,使它运行得更好。我在上面的评论中问过这个问题,但是您能解释一下“转换中可能的值更改”和“参数中的类型不匹配”警告之间的区别吗?在我看来,他们似乎在用两种不同的方式说同一件事。。。再次感谢!