Puzzle computing arrays
Angelo Graziosi
angelo.graziosi@alice.it
Tue Jun 10 07:04:00 GMT 2008
Tim Prince ha scritto:
> Angelo Graziosi wrote:
>> The following happens on Cygwin with GFortran 4.3.1 and on GNU/Linux
>> Kubuntu 8.04 with GFortran 4.3.1 and 4.2.3.
>>
>> In the following test case (reduced to the simplest form), the array
>> elements of BB() and b() are computed exactly with the same expression
>> (copy/pasted), but the results seem a little different (only on
>> 14-15th digit)
>>
>> $ cat test_case.f90
>> !
>> ! gfortran test_case.f90 -o test_case
>> !
>> program test_case
>> implicit none
>> integer :: k
>> integer, parameter :: DP = kind(1.D0),&
>> N = 3
>> real(DP), parameter :: A(0:N) = &
>> (/1.0000000000D0,3.8860009363D0,7.4167881843D0,&
>> 9.8599837415D0/)
>> real(DP), parameter :: BB(0:N-1) = &
>> (/((A(k+1)*(A(1)+k+1)),k = 0,N-2),(A(N)*(A(1)+N))/)
>> real(DP) :: b(0:N-1)
>> do k = 0,N-2
>> b(k) = A(k+1)*(A(1)+k+1)
>> enddo
>> b(N-1) = A(N)*(A(1)+N)
>> do k = 0,N-1
>> !print *, k,b(k),BB(k),b(k)-BB(k)
>> print *, k,b(k)-BB(k)
>> enddo
>> end program test_case
>>
>> $ gfortran test_case.f90 -o test_case
>>
>> $ ./test_case.exe
>> 0 0.0000000000000000
>> 1 -7.10542735760100186E-015
>> 2 0.0000000000000000
>>
>> Since BB() and b() are computed with the same expression, I would
>> expect the same results. But BB() is a PARAMETER (computed at compile
>> time???) and b() is computed at run time...
>>
>> So, what could be the difference? What explanation may you give?
>>
> Don't the compile time calculations get extra precision from mpfr and
> friends? The run-time calculation would make more sense with
> parentheses (k+1) to specify a single round-off.
>
So, which is the best solution?
Your conclusion is not clear to me, sorry!
Cheers,
Angelo.
More information about the Fortran
mailing list