Seen on intel architectures (i686, x86_64). Run following example code:

      program test

      complex cres1, cres2, ivc
      parameter(ivc = (0,1))

      const= 0
      fact = 0.5
      cres1 = csqrt(const + ivc*fact)
      cres2 = csqrt(const - ivc*fact)
      print*,'cres1=',cres1, 'cres2=',cres2
      const= 1.e-30
      cres1 = csqrt(const + ivc*fact)
      cres2 = csqrt(const - ivc*fact)
      print*,'cres1=',cres1, 'cres2=',cres2

      stop
      end

The result is:
 cres1= ( 0.5000000    , 0.5000000    ) cres2= (-0.5000000    , 0.5000000    )
 cres1= ( 0.5000000    , 0.5000000    ) cres2= ( 0.5000000    ,-0.5000000    )

The first line shows the wrong result, the second is that what one expects.
The compiler used it taken from gcc SVN. gfortran -v gives:
gcc version 4.1.0 20051118 (experimental)


-- 
           Summary: sqrt, csqrt may give a wrong result if real part of
                    compex argument is zero
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libfortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: harald dot vogt at desy dot de


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25017

Reply via email to