我注意到如果我使用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}空格的输出})。
有谁知道为什么会这样?
答案 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-0
,ifort 12.0.2.137
,gfortran 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 ,其中d1
和d2
是依赖于处理器的整数。如果 幅度x
在此范围内,常数使用0PFw.d
生成;否则,使用1PEw.dEe
。对于数字输出,
w
,d
和e
的合理的依赖于处理器的值用于每个数字常量输出。
(强调我的)
相同的规则用于数值。 Fortran 2008标准§10.10.4中的文本从Fortran 90标准中复制,因此没有引入列表导向输出的更改。
正如M. S. B.已经指出的那样,您可以使用I0
编辑描述符以最少的空间打印整数值:
! Note the space in the string
PRINT '("The difference is ",I0)', diff