救命!传递FORTRAN整数会将它们转换为不准确的浮点数吗?

时间:2010-12-12 13:21:40

标签: types integer fortran argument-passing subroutine

当我创建一个标量INTEGER,并将其传递给子程序时,它的值将被转换为浮点数并且非常不准确。例如,如果我将s = 2和CALL print_my_int(s)设置为将其写入控制台(),则其值显示为2.80259693E-45。除了s = 0的情况外,其他标量整数的行为类似,在这种情况下,输出为0.0000000。但即使这仍然是错误的,因为整数显然不应显示小数和尾数。这不是输出格式问题,因为我可以在本地显示时正确显示其他整数。

有关这里发生了什么的任何线索?我是否需要在子例程定义中强制参数数据类型?甚至可以这样做吗?

示例代码:

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
   WRITE(*,*) x
END SUBROUTINE print_my_int

结果输出:

2.80259693E-45

3 个答案:

答案 0 :(得分:3)

另一个扩展评论,比@ steabert更简单:

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)

CONTAINS

SUBROUTINE print_my_int(x)
   WRITE(*,*) x
END SUBROUTINE print_my_int

END PROGRAM print_int

通过在程序中包含子程序,您可以强制编译器进行显式接口,从而节省3行代码。通过在子例程中隐含x的声明,编译器会发现错误。

答案 1 :(得分:2)

没有什么新东西,只想通过提供一些不符合评论的代码来指出界面的使用:

如上所述,您可以在声明部分的开头放置implicit none,或者您可以在程序中放置一个使用子例程的接口,然后编译器将抛出类型不匹配错误:

PROGRAM print_int
INTERFACE
    SUBROUTINE print_my_int(x)
    END SUBROUTINE
END INTERFACE
INTEGER  s
s = 2
CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
WRITE(*,*) x
END SUBROUTINE print_my_int

答案 2 :(得分:1)

好的,过早的发布,但我会把它留给任何碰到同样的人。我不习惯在FORTRAN中强制执行参数类型的语法。在子例程定义中,参数的数据类型位于名称和参数列表下方。如果不包括在内,GNU编译器不会发出警告或发出尖叫声。我想它默认将它转换为其他类型。所以,我上面的例子应该是这样的......

PROGRAM print_int
   INTEGER  s
   s = 2
   CALL print_my_int(s)
END PROGRAM print_int

SUBROUTINE print_my_int(x)
   INTEGER  x
   WRITE(*,*) x
END SUBROUTINE print_my_int