201 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Fortran
		
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Fortran
		
	
	
	
*> \brief \b IEEECK
 | 
						|
*
 | 
						|
*  =========== DOCUMENTATION ===========
 | 
						|
*
 | 
						|
* Online html documentation available at
 | 
						|
*            http://www.netlib.org/lapack/explore-html/
 | 
						|
*
 | 
						|
*> \htmlonly
 | 
						|
*> Download IEEECK + dependencies
 | 
						|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ieeeck.f">
 | 
						|
*> [TGZ]</a>
 | 
						|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ieeeck.f">
 | 
						|
*> [ZIP]</a>
 | 
						|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ieeeck.f">
 | 
						|
*> [TXT]</a>
 | 
						|
*> \endhtmlonly
 | 
						|
*
 | 
						|
*  Definition:
 | 
						|
*  ===========
 | 
						|
*
 | 
						|
*       INTEGER          FUNCTION IEEECK( ISPEC, ZERO, ONE )
 | 
						|
*
 | 
						|
*       .. Scalar Arguments ..
 | 
						|
*       INTEGER            ISPEC
 | 
						|
*       REAL               ONE, ZERO
 | 
						|
*       ..
 | 
						|
*
 | 
						|
*
 | 
						|
*> \par Purpose:
 | 
						|
*  =============
 | 
						|
*>
 | 
						|
*> \verbatim
 | 
						|
*>
 | 
						|
*> IEEECK is called from the ILAENV to verify that Infinity and
 | 
						|
*> possibly NaN arithmetic is safe (i.e. will not trap).
 | 
						|
*> \endverbatim
 | 
						|
*
 | 
						|
*  Arguments:
 | 
						|
*  ==========
 | 
						|
*
 | 
						|
*> \param[in] ISPEC
 | 
						|
*> \verbatim
 | 
						|
*>          ISPEC is INTEGER
 | 
						|
*>          Specifies whether to test just for infinity arithmetic
 | 
						|
*>          or whether to test for infinity and NaN arithmetic.
 | 
						|
*>          = 0: Verify infinity arithmetic only.
 | 
						|
*>          = 1: Verify infinity and NaN arithmetic.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] ZERO
 | 
						|
*> \verbatim
 | 
						|
*>          ZERO is REAL
 | 
						|
*>          Must contain the value 0.0
 | 
						|
*>          This is passed to prevent the compiler from optimizing
 | 
						|
*>          away this code.
 | 
						|
*> \endverbatim
 | 
						|
*>
 | 
						|
*> \param[in] ONE
 | 
						|
*> \verbatim
 | 
						|
*>          ONE is REAL
 | 
						|
*>          Must contain the value 1.0
 | 
						|
*>          This is passed to prevent the compiler from optimizing
 | 
						|
*>          away this code.
 | 
						|
*>
 | 
						|
*>  RETURN VALUE:  INTEGER
 | 
						|
*>          = 0:  Arithmetic failed to produce the correct answers
 | 
						|
*>          = 1:  Arithmetic produced the correct answers
 | 
						|
*> \endverbatim
 | 
						|
*
 | 
						|
*  Authors:
 | 
						|
*  ========
 | 
						|
*
 | 
						|
*> \author Univ. of Tennessee
 | 
						|
*> \author Univ. of California Berkeley
 | 
						|
*> \author Univ. of Colorado Denver
 | 
						|
*> \author NAG Ltd.
 | 
						|
*
 | 
						|
*> \ingroup OTHERauxiliary
 | 
						|
*
 | 
						|
*  =====================================================================
 | 
						|
      INTEGER          FUNCTION IEEECK( ISPEC, ZERO, ONE )
 | 
						|
*
 | 
						|
*  -- LAPACK auxiliary routine --
 | 
						|
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
 | 
						|
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 | 
						|
*
 | 
						|
*     .. Scalar Arguments ..
 | 
						|
      INTEGER            ISPEC
 | 
						|
      REAL               ONE, ZERO
 | 
						|
*     ..
 | 
						|
*
 | 
						|
*  =====================================================================
 | 
						|
*
 | 
						|
*     .. Local Scalars ..
 | 
						|
      REAL               NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF,
 | 
						|
     $                   NEGZRO, NEWZRO, POSINF
 | 
						|
*     ..
 | 
						|
*     .. Executable Statements ..
 | 
						|
      IEEECK = 1
 | 
						|
*
 | 
						|
      POSINF = ONE / ZERO
 | 
						|
      IF( POSINF.LE.ONE ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      NEGINF = -ONE / ZERO
 | 
						|
      IF( NEGINF.GE.ZERO ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      NEGZRO = ONE / ( NEGINF+ONE )
 | 
						|
      IF( NEGZRO.NE.ZERO ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      NEGINF = ONE / NEGZRO
 | 
						|
      IF( NEGINF.GE.ZERO ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      NEWZRO = NEGZRO + ZERO
 | 
						|
      IF( NEWZRO.NE.ZERO ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      POSINF = ONE / NEWZRO
 | 
						|
      IF( POSINF.LE.ONE ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      NEGINF = NEGINF*POSINF
 | 
						|
      IF( NEGINF.GE.ZERO ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      POSINF = POSINF*POSINF
 | 
						|
      IF( POSINF.LE.ONE ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
*
 | 
						|
*
 | 
						|
*
 | 
						|
*     Return if we were only asked to check infinity arithmetic
 | 
						|
*
 | 
						|
      IF( ISPEC.EQ.0 )
 | 
						|
     $   RETURN
 | 
						|
*
 | 
						|
      NAN1 = POSINF + NEGINF
 | 
						|
*
 | 
						|
      NAN2 = POSINF / NEGINF
 | 
						|
*
 | 
						|
      NAN3 = POSINF / POSINF
 | 
						|
*
 | 
						|
      NAN4 = POSINF*ZERO
 | 
						|
*
 | 
						|
      NAN5 = NEGINF*NEGZRO
 | 
						|
*
 | 
						|
      NAN6 = NAN5*ZERO
 | 
						|
*
 | 
						|
      IF( NAN1.EQ.NAN1 ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      IF( NAN2.EQ.NAN2 ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      IF( NAN3.EQ.NAN3 ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      IF( NAN4.EQ.NAN4 ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      IF( NAN5.EQ.NAN5 ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      IF( NAN6.EQ.NAN6 ) THEN
 | 
						|
         IEEECK = 0
 | 
						|
         RETURN
 | 
						|
      END IF
 | 
						|
*
 | 
						|
      RETURN
 | 
						|
      END
 |