erfc.f 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. *DECK ERFC
  2. FUNCTION ERFC (X)
  3. C***BEGIN PROLOGUE ERFC
  4. C***PURPOSE Compute the complementary error function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C8A, L5A1E
  7. C***TYPE SINGLE PRECISION (ERFC-S, DERFC-D)
  8. C***KEYWORDS COMPLEMENTARY ERROR FUNCTION, ERFC, FNLIB,
  9. C SPECIAL FUNCTIONS
  10. C***AUTHOR Fullerton, W., (LANL)
  11. C***DESCRIPTION
  12. C
  13. C ERFC(X) calculates the single precision complementary error
  14. C function for single precision argument X.
  15. C
  16. C Series for ERF on the interval 0. to 1.00000D+00
  17. C with weighted error 7.10E-18
  18. C log weighted error 17.15
  19. C significant figures required 16.31
  20. C decimal places required 17.71
  21. C
  22. C Series for ERFC on the interval 0. to 2.50000D-01
  23. C with weighted error 4.81E-17
  24. C log weighted error 16.32
  25. C approx significant figures required 15.0
  26. C
  27. C
  28. C Series for ERC2 on the interval 2.50000D-01 to 1.00000D+00
  29. C with weighted error 5.22E-17
  30. C log weighted error 16.28
  31. C approx significant figures required 15.0
  32. C decimal places required 16.96
  33. C
  34. C***REFERENCES (NONE)
  35. C***ROUTINES CALLED CSEVL, INITS, R1MACH, XERMSG
  36. C***REVISION HISTORY (YYMMDD)
  37. C 770701 DATE WRITTEN
  38. C 890531 Changed all specific intrinsics to generic. (WRB)
  39. C 890531 REVISION DATE from Version 3.2
  40. C 891214 Prologue converted to Version 4.0 format. (BAB)
  41. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  42. C 920618 Removed space from variable names. (RWC, WRB)
  43. C***END PROLOGUE ERFC
  44. DIMENSION ERFCS(13), ERFCCS(24), ERC2CS(23)
  45. LOGICAL FIRST
  46. SAVE ERFCS, ERC2CS, ERFCCS, SQRTPI, NTERF, NTERFC,
  47. 1 NTERC2, XSML, XMAX, SQEPS, FIRST
  48. DATA ERFCS( 1) / -.0490461212 34691808E0 /
  49. DATA ERFCS( 2) / -.1422612051 0371364E0 /
  50. DATA ERFCS( 3) / .0100355821 87599796E0 /
  51. DATA ERFCS( 4) / -.0005768764 69976748E0 /
  52. DATA ERFCS( 5) / .0000274199 31252196E0 /
  53. DATA ERFCS( 6) / -.0000011043 17550734E0 /
  54. DATA ERFCS( 7) / .0000000384 88755420E0 /
  55. DATA ERFCS( 8) / -.0000000011 80858253E0 /
  56. DATA ERFCS( 9) / .0000000000 32334215E0 /
  57. DATA ERFCS(10) / -.0000000000 00799101E0 /
  58. DATA ERFCS(11) / .0000000000 00017990E0 /
  59. DATA ERFCS(12) / -.0000000000 00000371E0 /
  60. DATA ERFCS(13) / .0000000000 00000007E0 /
  61. DATA ERC2CS( 1) / -.0696013466 02309501E0 /
  62. DATA ERC2CS( 2) / -.0411013393 62620893E0 /
  63. DATA ERC2CS( 3) / .0039144958 66689626E0 /
  64. DATA ERC2CS( 4) / -.0004906395 65054897E0 /
  65. DATA ERC2CS( 5) / .0000715747 90013770E0 /
  66. DATA ERC2CS( 6) / -.0000115307 16341312E0 /
  67. DATA ERC2CS( 7) / .0000019946 70590201E0 /
  68. DATA ERC2CS( 8) / -.0000003642 66647159E0 /
  69. DATA ERC2CS( 9) / .0000000694 43726100E0 /
  70. DATA ERC2CS(10) / -.0000000137 12209021E0 /
  71. DATA ERC2CS(11) / .0000000027 88389661E0 /
  72. DATA ERC2CS(12) / -.0000000005 81416472E0 /
  73. DATA ERC2CS(13) / .0000000001 23892049E0 /
  74. DATA ERC2CS(14) / -.0000000000 26906391E0 /
  75. DATA ERC2CS(15) / .0000000000 05942614E0 /
  76. DATA ERC2CS(16) / -.0000000000 01332386E0 /
  77. DATA ERC2CS(17) / .0000000000 00302804E0 /
  78. DATA ERC2CS(18) / -.0000000000 00069666E0 /
  79. DATA ERC2CS(19) / .0000000000 00016208E0 /
  80. DATA ERC2CS(20) / -.0000000000 00003809E0 /
  81. DATA ERC2CS(21) / .0000000000 00000904E0 /
  82. DATA ERC2CS(22) / -.0000000000 00000216E0 /
  83. DATA ERC2CS(23) / .0000000000 00000052E0 /
  84. DATA ERFCCS( 1) / 0.0715179310 202925E0 /
  85. DATA ERFCCS( 2) / -.0265324343 37606719E0 /
  86. DATA ERFCCS( 3) / .0017111539 77920853E0 /
  87. DATA ERFCCS( 4) / -.0001637516 63458512E0 /
  88. DATA ERFCCS( 5) / .0000198712 93500549E0 /
  89. DATA ERFCCS( 6) / -.0000028437 12412769E0 /
  90. DATA ERFCCS( 7) / .0000004606 16130901E0 /
  91. DATA ERFCCS( 8) / -.0000000822 77530261E0 /
  92. DATA ERFCCS( 9) / .0000000159 21418724E0 /
  93. DATA ERFCCS(10) / -.0000000032 95071356E0 /
  94. DATA ERFCCS(11) / .0000000007 22343973E0 /
  95. DATA ERFCCS(12) / -.0000000001 66485584E0 /
  96. DATA ERFCCS(13) / .0000000000 40103931E0 /
  97. DATA ERFCCS(14) / -.0000000000 10048164E0 /
  98. DATA ERFCCS(15) / .0000000000 02608272E0 /
  99. DATA ERFCCS(16) / -.0000000000 00699105E0 /
  100. DATA ERFCCS(17) / .0000000000 00192946E0 /
  101. DATA ERFCCS(18) / -.0000000000 00054704E0 /
  102. DATA ERFCCS(19) / .0000000000 00015901E0 /
  103. DATA ERFCCS(20) / -.0000000000 00004729E0 /
  104. DATA ERFCCS(21) / .0000000000 00001432E0 /
  105. DATA ERFCCS(22) / -.0000000000 00000439E0 /
  106. DATA ERFCCS(23) / .0000000000 00000138E0 /
  107. DATA ERFCCS(24) / -.0000000000 00000048E0 /
  108. DATA SQRTPI /1.772453850 9055160E0/
  109. DATA FIRST /.TRUE./
  110. C***FIRST EXECUTABLE STATEMENT ERFC
  111. IF (FIRST) THEN
  112. ETA = 0.1*R1MACH(3)
  113. NTERF = INITS (ERFCS, 13, ETA)
  114. NTERFC = INITS (ERFCCS, 24, ETA)
  115. NTERC2 = INITS (ERC2CS, 23, ETA)
  116. C
  117. XSML = -SQRT (-LOG(SQRTPI*R1MACH(3)))
  118. TXMAX = SQRT (-LOG(SQRTPI*R1MACH(1)))
  119. XMAX = TXMAX - 0.5*LOG(TXMAX)/TXMAX - 0.01
  120. SQEPS = SQRT (2.0*R1MACH(3))
  121. ENDIF
  122. FIRST = .FALSE.
  123. C
  124. IF (X.GT.XSML) GO TO 20
  125. C
  126. C ERFC(X) = 1.0 - ERF(X) FOR X .LT. XSML
  127. C
  128. ERFC = 2.
  129. RETURN
  130. C
  131. 20 IF (X.GT.XMAX) GO TO 40
  132. Y = ABS(X)
  133. IF (Y.GT.1.0) GO TO 30
  134. C
  135. C ERFC(X) = 1.0 - ERF(X) FOR -1. .LE. X .LE. 1.
  136. C
  137. IF (Y.LT.SQEPS) ERFC = 1.0 - 2.0*X/SQRTPI
  138. IF (Y.GE.SQEPS) ERFC = 1.0 -
  139. 1 X*(1.0 + CSEVL (2.*X*X-1., ERFCS, NTERF) )
  140. RETURN
  141. C
  142. C ERFC(X) = 1.0 - ERF(X) FOR 1. .LT. ABS(X) .LE. XMAX
  143. C
  144. 30 Y = Y*Y
  145. IF (Y.LE.4.) ERFC = EXP(-Y)/ABS(X) * (0.5 + CSEVL ((8./Y-5.)/3.,
  146. 1 ERC2CS, NTERC2) )
  147. IF (Y.GT.4.) ERFC = EXP(-Y)/ABS(X) * (0.5 + CSEVL (8./Y-1.,
  148. 1 ERFCCS, NTERFC) )
  149. IF (X.LT.0.) ERFC = 2.0 - ERFC
  150. RETURN
  151. C
  152. 40 CALL XERMSG ('SLATEC', 'ERFC', 'X SO BIG ERFC UNDERFLOWS', 1, 1)
  153. ERFC = 0.
  154. RETURN
  155. C
  156. END