使用print语句进行整数输出格式化

时间:2012-08-05 01:43:06

标签: fortran

我注意到如果我使用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)integer作为变量时,我得到了

The difference is             25164150

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

有谁知道为什么会这样?

3 个答案:

答案 0 :(得分: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-0ifort 12.0.2.137gfortran 4.5.1)都不支持四精度整数。可能是编译器hackery。有人可能对这部分有更多的经验,希望他们会参与其中。

答案 1 :(得分:5)

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

作为附带问题,“整数(N)”不保证是N字节整数。它与“整数* 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。

答案 2 :(得分:4)

列表定向输出是特定于处理器的(注意Fortran标准调用“处理器”,我们通常称之为“编译器”)。以下是Fortran 90标准关于列表导向输出的内容:

  

10.8.2列表导向输出

     

...

     

使用Iw编辑描述符生成整数输出常量。

     

根据值的大小F和范围10 d1生成具有E编辑描述符或x编辑描述符效果的实常数< = x< 10 d2 ,其中d1d2是依赖于处理器的整数。如果   幅度x在此范围内,常数使用0PFw.d生成;否则,使用1PEw.dEe

     

对于数字输出,wde合理的依赖于处理器的值用于每个数字常量输出。

(强调我的)

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

正如M. S. B.已经指出的那样,您可以使用I0编辑描述符以最少的空间打印整数值:

! Note the space in the string
PRINT '("The difference is ",I0)', diff