作者:王言 | 来源:互联网 | 2022-12-24 09:37
假设我有3个双精度数组,
real*8, dimension(n) :: x, y, z
初始化为
x = 1.
y = (/ (1., i=1,n) /)
z = (/ (1. +0*i, i=1,n) /)
他们应该将所有数组的所有元素初始化为1
.在ifort
(16.0.0 20150815)中,这适用n
于声明的精度范围内的任何范围.也就是说,如果我们初始化n
为
integer*4, parameter :: n
然后,只要n <2147483647
初始化按预期用于所有声明.
在gfortran
(4.8.5 20150623红帽4.8.5-16),初始化失败对于y
(具有恒定的参数数组理解),只要n>65535
,独立的其精度.AFAIK,65535
是a的最大值unsigned short int
,也就是说unsigned int*2
,它在范围内integer*4
.
以下是MWE:
program test
implicit none
integer*4, parameter :: n = 65536
integer*4, parameter :: m = 65535
real*8, dimension(n) :: x, y, z
real*8, dimension(m) :: a, b, c
integer*4 :: i
print *, huge(n)
x = 1.
y = (/ (1., i=1,n) /)
z = (/ (1.+0*i, i=1,n) /)
print *, x(n), y(n), z(n)
a = 1.
b = (/ (1., i=1,m) /)
c = (/ (1.+0*i, i=1,m) /)
print *, a(m), c(m), c(m)
end program test
用gfortran
(gfortran test.f90 -o gfortran_test
)编译,它输出:
2147483647
1.0000000000000000 0.0000000000000000 1.0000000000000000
1.0000000000000000 1.0000000000000000 1.0000000000000000
用ifort
(ifort test.f90 -o ifort_test
)编译,它输出:
2147483647
1.00000000000000 1.00000000000000 1.00000000000000
1.00000000000000 1.00000000000000 1.00000000000000
是什么赋予了?