r1mach.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. *DECK R1MACH
  2. REAL FUNCTION R1MACH (I)
  3. C***BEGIN PROLOGUE R1MACH
  4. C***PURPOSE Return floating point machine dependent constants.
  5. C***LIBRARY SLATEC
  6. C***CATEGORY R1
  7. C***TYPE SINGLE PRECISION (R1MACH-S, D1MACH-D)
  8. C***KEYWORDS MACHINE CONSTANTS
  9. C***AUTHOR Fox, P. A., (Bell Labs)
  10. C Hall, A. D., (Bell Labs)
  11. C Schryer, N. L., (Bell Labs)
  12. C***DESCRIPTION
  13. C
  14. C R1MACH can be used to obtain machine-dependent parameters for the
  15. C local machine environment. It is a function subprogram with one
  16. C (input) argument, and can be referenced as follows:
  17. C
  18. C A = R1MACH(I)
  19. C
  20. C where I=1,...,5. The (output) value of A above is determined by
  21. C the (input) value of I. The results for various values of I are
  22. C discussed below.
  23. C
  24. C R1MACH(1) = B**(EMIN-1), the smallest positive magnitude.
  25. C R1MACH(2) = B**EMAX*(1 - B**(-T)), the largest magnitude.
  26. C R1MACH(3) = B**(-T), the smallest relative spacing.
  27. C R1MACH(4) = B**(1-T), the largest relative spacing.
  28. C R1MACH(5) = LOG10(B)
  29. C
  30. C Assume single precision numbers are represented in the T-digit,
  31. C base-B form
  32. C
  33. C sign (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
  34. C
  35. C where 0 .LE. X(I) .LT. B for I=1,...,T, 0 .LT. X(1), and
  36. C EMIN .LE. E .LE. EMAX.
  37. C
  38. C The values of B, T, EMIN and EMAX are provided in I1MACH as
  39. C follows:
  40. C I1MACH(10) = B, the base.
  41. C I1MACH(11) = T, the number of base-B digits.
  42. C I1MACH(12) = EMIN, the smallest exponent E.
  43. C I1MACH(13) = EMAX, the largest exponent E.
  44. C
  45. C To alter this function for a particular environment, the desired
  46. C set of DATA statements should be activated by removing the C from
  47. C column 1. Also, the values of R1MACH(1) - R1MACH(4) should be
  48. C checked for consistency with the local operating system.
  49. C
  50. C***REFERENCES P. A. Fox, A. D. Hall and N. L. Schryer, Framework for
  51. C a portable library, ACM Transactions on Mathematical
  52. C Software 4, 2 (June 1978), pp. 177-188.
  53. C***ROUTINES CALLED XERMSG
  54. C***REVISION HISTORY (YYMMDD)
  55. C 790101 DATE WRITTEN
  56. C 890213 REVISION DATE from Version 3.2
  57. C 891214 Prologue converted to Version 4.0 format. (BAB)
  58. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  59. C 900618 Added DEC RISC constants. (WRB)
  60. C 900723 Added IBM RS 6000 constants. (WRB)
  61. C 910710 Added HP 730 constants. (SMR)
  62. C 911114 Added Convex IEEE constants. (WRB)
  63. C 920121 Added SUN -r8 compiler option constants. (WRB)
  64. C 920229 Added Touchstone Delta i860 constants. (WRB)
  65. C 920501 Reformatted the REFERENCES section. (WRB)
  66. C 920625 Added CONVEX -p8 and -pd8 compiler option constants.
  67. C (BKS, WRB)
  68. C 930201 Added DEC Alpha and SGI constants. (RWC and WRB)
  69. C***END PROLOGUE R1MACH
  70. C
  71. INTEGER SMALL(2)
  72. INTEGER LARGE(2)
  73. INTEGER RIGHT(2)
  74. INTEGER DIVER(2)
  75. INTEGER LOG10(2)
  76. C
  77. REAL RMACH(5)
  78. SAVE RMACH
  79. C
  80. EQUIVALENCE (RMACH(1),SMALL(1))
  81. EQUIVALENCE (RMACH(2),LARGE(1))
  82. EQUIVALENCE (RMACH(3),RIGHT(1))
  83. EQUIVALENCE (RMACH(4),DIVER(1))
  84. EQUIVALENCE (RMACH(5),LOG10(1))
  85. C
  86. C MACHINE CONSTANTS FOR THE AMIGA
  87. C ABSOFT FORTRAN COMPILER USING THE 68020/68881 COMPILER OPTION
  88. C
  89. C DATA SMALL(1) / Z'00800000' /
  90. C DATA LARGE(1) / Z'7F7FFFFF' /
  91. C DATA RIGHT(1) / Z'33800000' /
  92. C DATA DIVER(1) / Z'34000000' /
  93. C DATA LOG10(1) / Z'3E9A209B' /
  94. C
  95. C MACHINE CONSTANTS FOR THE AMIGA
  96. C ABSOFT FORTRAN COMPILER USING SOFTWARE FLOATING POINT
  97. C
  98. C DATA SMALL(1) / Z'00800000' /
  99. C DATA LARGE(1) / Z'7EFFFFFF' /
  100. C DATA RIGHT(1) / Z'33800000' /
  101. C DATA DIVER(1) / Z'34000000' /
  102. C DATA LOG10(1) / Z'3E9A209B' /
  103. C
  104. C MACHINE CONSTANTS FOR THE APOLLO
  105. C
  106. C DATA SMALL(1) / 16#00800000 /
  107. C DATA LARGE(1) / 16#7FFFFFFF /
  108. C DATA RIGHT(1) / 16#33800000 /
  109. C DATA DIVER(1) / 16#34000000 /
  110. C DATA LOG10(1) / 16#3E9A209B /
  111. C
  112. C MACHINE CONSTANTS FOR THE BURROUGHS 1700 SYSTEM
  113. C
  114. C DATA RMACH(1) / Z400800000 /
  115. C DATA RMACH(2) / Z5FFFFFFFF /
  116. C DATA RMACH(3) / Z4E9800000 /
  117. C DATA RMACH(4) / Z4EA800000 /
  118. C DATA RMACH(5) / Z500E730E8 /
  119. C
  120. C MACHINE CONSTANTS FOR THE BURROUGHS 5700/6700/7700 SYSTEMS
  121. C
  122. C DATA RMACH(1) / O1771000000000000 /
  123. C DATA RMACH(2) / O0777777777777777 /
  124. C DATA RMACH(3) / O1311000000000000 /
  125. C DATA RMACH(4) / O1301000000000000 /
  126. C DATA RMACH(5) / O1157163034761675 /
  127. C
  128. C MACHINE CONSTANTS FOR THE CDC 170/180 SERIES USING NOS/VE
  129. C
  130. C DATA RMACH(1) / Z"3001800000000000" /
  131. C DATA RMACH(2) / Z"4FFEFFFFFFFFFFFE" /
  132. C DATA RMACH(3) / Z"3FD2800000000000" /
  133. C DATA RMACH(4) / Z"3FD3800000000000" /
  134. C DATA RMACH(5) / Z"3FFF9A209A84FBCF" /
  135. C
  136. C MACHINE CONSTANTS FOR THE CDC 6000/7000 SERIES
  137. C
  138. C DATA RMACH(1) / 00564000000000000000B /
  139. C DATA RMACH(2) / 37767777777777777776B /
  140. C DATA RMACH(3) / 16414000000000000000B /
  141. C DATA RMACH(4) / 16424000000000000000B /
  142. C DATA RMACH(5) / 17164642023241175720B /
  143. C
  144. C MACHINE CONSTANTS FOR THE CELERITY C1260
  145. C
  146. C DATA SMALL(1) / Z'00800000' /
  147. C DATA LARGE(1) / Z'7F7FFFFF' /
  148. C DATA RIGHT(1) / Z'33800000' /
  149. C DATA DIVER(1) / Z'34000000' /
  150. C DATA LOG10(1) / Z'3E9A209B' /
  151. C
  152. C MACHINE CONSTANTS FOR THE CONVEX
  153. C USING THE -fn COMPILER OPTION
  154. C
  155. C DATA RMACH(1) / Z'00800000' /
  156. C DATA RMACH(2) / Z'7FFFFFFF' /
  157. C DATA RMACH(3) / Z'34800000' /
  158. C DATA RMACH(4) / Z'35000000' /
  159. C DATA RMACH(5) / Z'3F9A209B' /
  160. C
  161. C MACHINE CONSTANTS FOR THE CONVEX
  162. C USING THE -fi COMPILER OPTION
  163. C
  164. C DATA RMACH(1) / Z'00800000' /
  165. C DATA RMACH(2) / Z'7F7FFFFF' /
  166. C DATA RMACH(3) / Z'33800000' /
  167. C DATA RMACH(4) / Z'34000000' /
  168. C DATA RMACH(5) / Z'3E9A209B' /
  169. C
  170. C MACHINE CONSTANTS FOR THE CONVEX
  171. C USING THE -p8 OR -pd8 COMPILER OPTION
  172. C
  173. C DATA RMACH(1) / Z'0010000000000000' /
  174. C DATA RMACH(2) / Z'7FFFFFFFFFFFFFFF' /
  175. C DATA RMACH(3) / Z'3CC0000000000000' /
  176. C DATA RMACH(4) / Z'3CD0000000000000' /
  177. C DATA RMACH(5) / Z'3FF34413509F79FF' /
  178. C
  179. C MACHINE CONSTANTS FOR THE CRAY
  180. C
  181. C DATA RMACH(1) / 200034000000000000000B /
  182. C DATA RMACH(2) / 577767777777777777776B /
  183. C DATA RMACH(3) / 377224000000000000000B /
  184. C DATA RMACH(4) / 377234000000000000000B /
  185. C DATA RMACH(5) / 377774642023241175720B /
  186. C
  187. C MACHINE CONSTANTS FOR THE DATA GENERAL ECLIPSE S/200
  188. C NOTE - IT MAY BE APPROPRIATE TO INCLUDE THE FOLLOWING CARD -
  189. C STATIC RMACH(5)
  190. C
  191. C DATA SMALL / 20K, 0 /
  192. C DATA LARGE / 77777K, 177777K /
  193. C DATA RIGHT / 35420K, 0 /
  194. C DATA DIVER / 36020K, 0 /
  195. C DATA LOG10 / 40423K, 42023K /
  196. C
  197. C MACHINE CONSTANTS FOR THE DEC ALPHA
  198. C USING G_FLOAT
  199. C
  200. C DATA RMACH(1) / '00000080'X /
  201. C DATA RMACH(2) / 'FFFF7FFF'X /
  202. C DATA RMACH(3) / '00003480'X /
  203. C DATA RMACH(4) / '00003500'X /
  204. C DATA RMACH(5) / '209B3F9A'X /
  205. C
  206. C MACHINE CONSTANTS FOR THE DEC ALPHA
  207. C USING IEEE_FLOAT
  208. C
  209. C DATA RMACH(1) / '00800000'X /
  210. C DATA RMACH(2) / '7F7FFFFF'X /
  211. C DATA RMACH(3) / '33800000'X /
  212. C DATA RMACH(4) / '34000000'X /
  213. C DATA RMACH(5) / '3E9A209B'X /
  214. C
  215. C MACHINE CONSTANTS FOR THE DEC RISC
  216. C
  217. C DATA RMACH(1) / Z'00800000' /
  218. C DATA RMACH(2) / Z'7F7FFFFF' /
  219. C DATA RMACH(3) / Z'33800000' /
  220. C DATA RMACH(4) / Z'34000000' /
  221. C DATA RMACH(5) / Z'3E9A209B' /
  222. C
  223. C MACHINE CONSTANTS FOR THE DEC VAX
  224. C (EXPRESSED IN INTEGER AND HEXADECIMAL)
  225. C THE HEX FORMAT BELOW MAY NOT BE SUITABLE FOR UNIX SYSTEMS
  226. C THE INTEGER FORMAT SHOULD BE OK FOR UNIX SYSTEMS
  227. C
  228. C DATA SMALL(1) / 128 /
  229. C DATA LARGE(1) / -32769 /
  230. C DATA RIGHT(1) / 13440 /
  231. C DATA DIVER(1) / 13568 /
  232. C DATA LOG10(1) / 547045274 /
  233. C
  234. C DATA SMALL(1) / Z00000080 /
  235. C DATA LARGE(1) / ZFFFF7FFF /
  236. C DATA RIGHT(1) / Z00003480 /
  237. C DATA DIVER(1) / Z00003500 /
  238. C DATA LOG10(1) / Z209B3F9A /
  239. C
  240. C MACHINE CONSTANTS FOR THE ELXSI 6400
  241. C (ASSUMING REAL*4 IS THE DEFAULT REAL)
  242. C
  243. C DATA SMALL(1) / '00800000'X /
  244. C DATA LARGE(1) / '7F7FFFFF'X /
  245. C DATA RIGHT(1) / '33800000'X /
  246. C DATA DIVER(1) / '34000000'X /
  247. C DATA LOG10(1) / '3E9A209B'X /
  248. C
  249. C MACHINE CONSTANTS FOR THE HARRIS 220
  250. C
  251. C DATA SMALL(1), SMALL(2) / '20000000, '00000201 /
  252. C DATA LARGE(1), LARGE(2) / '37777777, '00000177 /
  253. C DATA RIGHT(1), RIGHT(2) / '20000000, '00000352 /
  254. C DATA DIVER(1), DIVER(2) / '20000000, '00000353 /
  255. C DATA LOG10(1), LOG10(2) / '23210115, '00000377 /
  256. C
  257. C MACHINE CONSTANTS FOR THE HONEYWELL 600/6000 SERIES
  258. C
  259. C DATA RMACH(1) / O402400000000 /
  260. C DATA RMACH(2) / O376777777777 /
  261. C DATA RMACH(3) / O714400000000 /
  262. C DATA RMACH(4) / O716400000000 /
  263. C DATA RMACH(5) / O776464202324 /
  264. C
  265. C MACHINE CONSTANTS FOR THE HP 730
  266. C
  267. C DATA RMACH(1) / Z'00800000' /
  268. C DATA RMACH(2) / Z'7F7FFFFF' /
  269. C DATA RMACH(3) / Z'33800000' /
  270. C DATA RMACH(4) / Z'34000000' /
  271. C DATA RMACH(5) / Z'3E9A209B' /
  272. C
  273. C MACHINE CONSTANTS FOR THE HP 2100
  274. C 3 WORD DOUBLE PRECISION WITH FTN4
  275. C
  276. C DATA SMALL(1), SMALL(2) / 40000B, 1 /
  277. C DATA LARGE(1), LARGE(2) / 77777B, 177776B /
  278. C DATA RIGHT(1), RIGHT(2) / 40000B, 325B /
  279. C DATA DIVER(1), DIVER(2) / 40000B, 327B /
  280. C DATA LOG10(1), LOG10(2) / 46420B, 46777B /
  281. C
  282. C MACHINE CONSTANTS FOR THE HP 2100
  283. C 4 WORD DOUBLE PRECISION WITH FTN4
  284. C
  285. C DATA SMALL(1), SMALL(2) / 40000B, 1 /
  286. C DATA LARGE(1), LARGE(2) / 77777B, 177776B /
  287. C DATA RIGHT(1), RIGHT(2) / 40000B, 325B /
  288. C DATA DIVER(1), DIVER(2) / 40000B, 327B /
  289. C DATA LOG10(1), LOG10(2) / 46420B, 46777B /
  290. C
  291. C MACHINE CONSTANTS FOR THE HP 9000
  292. C
  293. C DATA SMALL(1) / 00004000000B /
  294. C DATA LARGE(1) / 17677777777B /
  295. C DATA RIGHT(1) / 06340000000B /
  296. C DATA DIVER(1) / 06400000000B /
  297. C DATA LOG10(1) / 07646420233B /
  298. C
  299. C MACHINE CONSTANTS FOR THE IBM 360/370 SERIES,
  300. C THE XEROX SIGMA 5/7/9, THE SEL SYSTEMS 85/86 AND
  301. C THE PERKIN ELMER (INTERDATA) 7/32.
  302. C
  303. C DATA RMACH(1) / Z00100000 /
  304. C DATA RMACH(2) / Z7FFFFFFF /
  305. C DATA RMACH(3) / Z3B100000 /
  306. C DATA RMACH(4) / Z3C100000 /
  307. C DATA RMACH(5) / Z41134413 /
  308. C
  309. C MACHINE CONSTANTS FOR THE IBM PC
  310. C
  311. C DATA SMALL(1) / 1.18E-38 /
  312. C DATA LARGE(1) / 3.40E+38 /
  313. C DATA RIGHT(1) / 0.595E-07 /
  314. C DATA DIVER(1) / 1.19E-07 /
  315. C DATA LOG10(1) / 0.30102999566 /
  316. C
  317. C MACHINE CONSTANTS FOR THE IBM RS 6000
  318. C
  319. C DATA RMACH(1) / Z'00800000' /
  320. C DATA RMACH(2) / Z'7F7FFFFF' /
  321. C DATA RMACH(3) / Z'33800000' /
  322. C DATA RMACH(4) / Z'34000000' /
  323. C DATA RMACH(5) / Z'3E9A209B' /
  324. C
  325. C MACHINE CONSTANTS FOR THE INTEL i860
  326. C
  327. C DATA RMACH(1) / Z'00800000' /
  328. C DATA RMACH(2) / Z'7F7FFFFF' /
  329. C DATA RMACH(3) / Z'33800000' /
  330. C DATA RMACH(4) / Z'34000000' /
  331. C DATA RMACH(5) / Z'3E9A209B' /
  332. C
  333. C MACHINE CONSTANTS FOR THE PDP-10 (KA OR KI PROCESSOR)
  334. C
  335. C DATA RMACH(1) / "000400000000 /
  336. C DATA RMACH(2) / "377777777777 /
  337. C DATA RMACH(3) / "146400000000 /
  338. C DATA RMACH(4) / "147400000000 /
  339. C DATA RMACH(5) / "177464202324 /
  340. C
  341. C MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
  342. C 32-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
  343. C
  344. C DATA SMALL(1) / 8388608 /
  345. C DATA LARGE(1) / 2147483647 /
  346. C DATA RIGHT(1) / 880803840 /
  347. C DATA DIVER(1) / 889192448 /
  348. C DATA LOG10(1) / 1067065499 /
  349. C
  350. C DATA RMACH(1) / O00040000000 /
  351. C DATA RMACH(2) / O17777777777 /
  352. C DATA RMACH(3) / O06440000000 /
  353. C DATA RMACH(4) / O06500000000 /
  354. C DATA RMACH(5) / O07746420233 /
  355. C
  356. C MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
  357. C 16-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
  358. C
  359. C DATA SMALL(1), SMALL(2) / 128, 0 /
  360. C DATA LARGE(1), LARGE(2) / 32767, -1 /
  361. C DATA RIGHT(1), RIGHT(2) / 13440, 0 /
  362. C DATA DIVER(1), DIVER(2) / 13568, 0 /
  363. C DATA LOG10(1), LOG10(2) / 16282, 8347 /
  364. C
  365. C DATA SMALL(1), SMALL(2) / O000200, O000000 /
  366. C DATA LARGE(1), LARGE(2) / O077777, O177777 /
  367. C DATA RIGHT(1), RIGHT(2) / O032200, O000000 /
  368. C DATA DIVER(1), DIVER(2) / O032400, O000000 /
  369. C DATA LOG10(1), LOG10(2) / O037632, O020233 /
  370. C
  371. C MACHINE CONSTANTS FOR THE SILICON GRAPHICS
  372. C
  373. C DATA RMACH(1) / Z'00800000' /
  374. C DATA RMACH(2) / Z'7F7FFFFF' /
  375. C DATA RMACH(3) / Z'33800000' /
  376. C DATA RMACH(4) / Z'34000000' /
  377. C DATA RMACH(5) / Z'3E9A209B' /
  378. C
  379. C MACHINE CONSTANTS FOR THE SUN
  380. C
  381. C DATA RMACH(1) / Z'00800000' /
  382. C DATA RMACH(2) / Z'7F7FFFFF' /
  383. C DATA RMACH(3) / Z'33800000' /
  384. C DATA RMACH(4) / Z'34000000' /
  385. C DATA RMACH(5) / Z'3E9A209B' /
  386. C
  387. C MACHINE CONSTANTS FOR THE SUN
  388. C USING THE -r8 COMPILER OPTION
  389. C
  390. C DATA RMACH(1) / Z'0010000000000000' /
  391. C DATA RMACH(2) / Z'7FEFFFFFFFFFFFFF' /
  392. C DATA RMACH(3) / Z'3CA0000000000000' /
  393. C DATA RMACH(4) / Z'3CB0000000000000' /
  394. C DATA RMACH(5) / Z'3FD34413509F79FF' /
  395. C
  396. C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES
  397. C
  398. C DATA RMACH(1) / O000400000000 /
  399. C DATA RMACH(2) / O377777777777 /
  400. C DATA RMACH(3) / O146400000000 /
  401. C DATA RMACH(4) / O147400000000 /
  402. C DATA RMACH(5) / O177464202324 /
  403. C
  404. C MACHINE CONSTANTS FOR THE Z80 MICROPROCESSOR
  405. C
  406. C DATA SMALL(1), SMALL(2) / 0, 256/
  407. C DATA LARGE(1), LARGE(2) / -1, -129/
  408. C DATA RIGHT(1), RIGHT(2) / 0, 26880/
  409. C DATA DIVER(1), DIVER(2) / 0, 27136/
  410. C DATA LOG10(1), LOG10(2) / 8347, 32538/
  411. C
  412. C***FIRST EXECUTABLE STATEMENT R1MACH
  413. IF (I .LT. 1 .OR. I .GT. 5) CALL XERMSG ('SLATEC', 'R1MACH',
  414. + 'I OUT OF BOUNDS', 1, 2)
  415. C
  416. R1MACH = RMACH(I)
  417. RETURN
  418. C
  419. END