在以下代码中,我将空数组传递给内部sum()
和product()
函数。
program test
implicit none
integer, allocatable :: A(:)
allocate( A( 0 ) )
print *, "sum = ", sum( A )
print *, "product = ", product( A )
end
然后,我尝试的所有编译器都给出了相同的结果:
sum = 0
product = 1
所以我想知道(1)是否允许将空数组传递给这些函数,(2)如果是这样,结果保证为0和1(根据Fortran标准)。为了比较,其他一些语言(例如Python3)也给出0和1,(我猜)可能与sum( [1,2,...,n] )
和product( [1,2,...,n] )
到n -> 0
的限制有关。
>>> import numpy as np
>>> np.sum( [] )
0.0
>>> np.prod( [] )
1.0
答案 0 :(得分:5)
是的,允许将零大小的数组传递给那些内在函数(以及许多其他数组),是的,这些结果是Fortran标准明确要求的。
same_path = maximise(arr[1:], sum+arr[0], orig_sum+arr[0], 0, arr[0])
(F2008,13.7.133):
PRODUCT(ARRAY)的结果值等于ARRAY所有元素乘积的处理器相关近似值,如果ARRAY的大小为零,则值为1。
product
(F2008,13.7.161):
SUM(ARRAY)的结果的值等于ARRAY所有元素之和的处理器相关近似值,如果ARRAY的大小为零,则其值为零。
答案 1 :(得分:0)
这些内在函数具有与f90相同的指定行为,并且一旦错误报告被处理,那些错误的编译器就会得到纠正。您可能正在考虑像maxloc这样的相关内在函数,这些内在函数在f2003中首次定义为0大小,但某些编译器仍然可以选择违反标准,支持使用非零大小的正确行为进行优化。