4

我注意到,如果我使用integer(16)变量,当我使用 时print,输出包含预期的确切空格数。因此,当我使用时(有些人可能会在这里识别出项目欧拉问题)

    implicit none
    integer(16)::sum_sq,sq_sum,diff,i
    sum_sq=0;sq_sum=0;
    do i=1,100
       sum_sq=sum_sq+i*i
       sq_sum=sq_sum+i
    enddo
    diff=abs(sq_sum**2-sum_sq)
    print *, "The difference is", diff

我明白了

The difference is 25164150

作为输出,但是当我使用integer(8)orinteger作为变量时,我得到

The difference is             25164150

作为输出。这发生在有和没有-m64标志的情况下,并且仅在 gfortran 上发生(我的 ifort 似乎不接受kind=16,这是一个需要处理的单独问题,但返回带有空格的输出integer(8))。

有谁知道为什么会这样?

4

3 回答 3

6

发生这种情况是因为您使用的是输出的默认格式。

print*等效于write(unit=*,fmt=*),其中fmt=*表示使用默认格式输出,这可能取决于编译器。默认格式使用输出的数据类型可能需要的尽可能多的空间,而不根据值进行调整。

考虑以下代码:

integer(kind=4) :: a ! short integer for my compiler
integer(kind=8) :: b ! long integer for my compiler

a = 23
b = huge(a)

print*,a       ! small value, short integer, we expect spaces
print*,huge(a) ! maximum value, short integer, we expect no spaces
print*,huge(b) ! maximum value, long integer, we expect no spaces
print*,b       ! medium lenght value, long integer, we expect spaces

end

使用 gfortran 编译时,输出为:

          23
  2147483647
  9223372036854775807
           2147483647

第一行是一个 4 字节整数表示的小数。注意要填充到最大可能大小的空间。第二行是 4 字节整数可以取的最大值。紧密贴合输出,没有空格。第三行是一个 8 字节整数的最大值。紧密贴合。第四行与第二行的值相同,但采用 8 字节整数表示。注意空格。

这回答了为什么您在输出中为默认格式设置空格。它并不能完全准确地回答您的问题,这就是为什么四精度整数的输出中没有空格的原因。我不知道。我的两个编译器 ( pgf90 10.6-0, ifort 12.0.2.137, gfortran 4.5.1) 都不支持四精度整数。可能是编译器黑客。有人可能对这部分有更多经验,希望他们能加入。

于 2012-08-05T04:54:49.673 回答
6

正如已经回答的那样,您正在使用列表导向的 IO,虽然方便,但语言标准并未完全指定。所以你会发现异能。如果要控制输出将需要使用格式。同样方便的是格式说明符“I0”,它使用输出项目所需的最小位数。

作为一个附带问题,“整数 (N)”不能保证是 N 字节整数。它与“integer*N”不同,后者不是语言标准的一部分。许多编译器使用类型的字节数作为类型值,但也有例外。事后看来,使用整数值来指定整数、实数和逻辑子类型是错误的。如果要按字节数选择类型,有从 Fortran 2003 开始​​的方法。Fortran 2003 的 ISO_C_Binding 模块提供了类型指示符,例如 C_INT32_T、C_INT64_T 和 C_INT128_T。Fortran 2008 的 ISO_FORTRAN_ENV 模块提供 INT8、INT16、INT32 和 INT64。

于 2012-08-05T05:22:17.220 回答
4

列表导向输出是特定于处理器的(请注意,Fortran 标准将我们通常称为“编译器”的“处理器”称为“处理器”)。以下是 Fortran 90 标准对列表导向输出的说明:

10.8.2 列表导向输出

...

整数输出常量是在Iw编辑描述符的作用下产生的。

根据值的大小和范围 10 d1 <= < 10 d2 ,生成实数常量,其效果取决于F编辑描述符或编辑描述符,其中和是与处理器相关的整数。如果幅度在此范围内,则使用;生成常数 否则,使用。Exxd1d2x0PFw.d1PEw.dEe

对于数值输出,合理的处理器相关值、和用于每个数值常量输出。wde

(强调我的)

相同的规则用于数值。Fortran 2008 标准第 10.10.4 节中的文本复制了 Fortran 90 标准中的文本,因此没有引入列表导向输出的任何更改。

正如 MSB 已经指出的,您可以使用I0编辑描述符以所需的最少空间打印整数值:

! Note the space in the string
PRINT '("The difference is ",I0)', diff
于 2012-08-06T08:50:45.730 回答