File: quad.f

package info (click to toggle)
x13as 1.1-b59-1
  • links: PTS, VCS
  • area: non-free
  • in suites: bookworm
  • size: 9,088 kB
  • sloc: fortran: 114,121; makefile: 14
file content (64 lines) | stat: -rw-r--r-- 2,558 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
C     Last change:  BCM  25 Nov 97   11:05 am
**==quad.f    processed by SPAG 4.03F  at 09:52 on  1 Mar 1994
      SUBROUTINE quad(A,B1,C,Snr,Sni,Lr,Li)
      IMPLICIT NONE
C **********************************************************************
C *                                                                    *
C * CALCULATE THE ZEROS OF THE QUADRATIC A*Z**2+B1*Z+C.                *
C * THE QUADRATIC FORMULA, MODIFIED TO AVOID OVERFLOW, IS USED TO      *
C *     FIND THE LARGER ZERO IF THE ZEROS ARE REAL AND BOTH ZEROS      *
C *     ARE COMPLEX.                                                   *
C * THE SMALLER REAL ZERO IS FOUND DIRECTLY FROM THE PRODUCT OF        *
C *     THE ZEROS C/A.                                                 *
C *                                                                    *
C **********************************************************************
      DOUBLE PRECISION ZERO,TWO
      PARAMETER(ZERO=0D0,TWO=2D0)
C-----------------------------------------------------------------------
      DOUBLE PRECISION A,B1,C,Snr,Sni,Lr,Li,b,d,e,dabs,dsqrt
C-----------------------------------------------------------------------
      LOGICAL dpeq
      EXTERNAL dpeq
C-----------------------------------------------------------------------
      IF(dpeq(A,ZERO))THEN
       Snr=ZERO
       IF(.not.dpeq(B1,ZERO))Snr=-C/B1
       Lr=ZERO
      ELSE IF(.not.dpeq(C,ZERO))THEN
C-----------------------------------------------------------------------
C COMPUTE DISCRIMINANT AVOIDING OVERFLOW
C-----------------------------------------------------------------------
       b=B1/TWO
       IF(dabs(b).lt.dabs(C))THEN
        e=A
        IF(C.lt.0.D0)e=-A
        e=b*(b/dabs(C))-e
        d=dsqrt(dabs(e))*dsqrt(dabs(C))
       ELSE
        e=1.D0-(A/b)*(C/b)
        d=dsqrt(dabs(e))*dabs(b)
       END IF
       IF(e.lt.ZERO)GO TO 10
C-----------------------------------------------------------------------
C REAL ZEROS
C-----------------------------------------------------------------------
       IF(b.ge.ZERO)d=-d
       Lr=(-b+d)/A
       Snr=ZERO
       IF(.not.dpeq(Lr,ZERO))Snr=(C/Lr)/A
      ELSE
       Snr=ZERO
       Lr=-B1/A
      END IF
      Sni=ZERO
      Li=ZERO
      RETURN
C-----------------------------------------------------------------------
C COMPLEX CONJUGATE ZEROS
C-----------------------------------------------------------------------
   10 Snr=-b/A
      Lr=Snr
      Sni=dabs(d/A)
      Li=-Sni
      RETURN
      END