Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
fmath.h
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2 of the GNU General Public License as
00007   published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if 
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU General Public License along
00021   with this program; if not, write the Free Software Foundation, Inc., 59
00022   Temple Place - Suite 330, Boston MA 02111-1307, USA.
00023 
00024   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00025   Mountain View, CA 94043, or:
00026 
00027   http://www.sgi.com
00028 
00029   For further information regarding this notice, see:
00030 
00031   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00032 
00033 */
00034 
00035 /* USMID @(#) clibinc/fmath.h   92.3    06/25/99 14:36:12 */
00036 
00037 /* The following values are used by the F90 compiler for a set of environment
00038  * intrinsics.  Some of the values are also used by the libf/intrin library
00039  * to return a value for some of the array intrinsics: DIGITS, EPSILON, HUGE,
00040  *  MAXEXPONENT, MINEXPONENT, PRECISION, RADIX, RANGE, TINY.
00041  * 
00042  * The F90 compiler needs a complete set of each IEEE and non-IEEE values.
00043  * Please keep the complete set of values for YMP and for IEEE.
00044  *
00045  * YMP/C90/etc:
00046  * Integer*1 =            2147483647 signed
00047  * Integer*2 =            2147483647 signed
00048  * Integer*4 =            2147483647 signed
00049  * Integer*6 =        70368744177663 46-bit value
00050  * Integer*8 =   9223372036854775807 signed
00051  * IEEE MPP and SPARC:
00052  * Integer*1 =            2147483647 signed
00053  * Integer*2 =            2147483647 signed
00054  * Integer*4 =            2147483647 signed
00055  * Integer*6 =   9223372036854775807 signed
00056  * Integer*8 =   9223372036854775807 signed
00057  * IEEE TRITON:
00058  * Integer*1 =            2147483647 signed
00059  * Integer*2 =            2147483647 signed
00060  * Integer*4 =            2147483647 signed
00061  * Integer*6 =      1125899906842623 50-bit limit - for fastmode only
00062  * Integer*8 =   9223372036854775807 signed
00063  */
00064 /* BIT_SIZE returns the number of bits s for an integer of kind n.
00065  * An integer object consists of s bits in sequence numbered from right to
00066  * left from zero to (s-1).  Fastmode bitsize is 64 bits on TRITON,ieee.
00067  */
00068 /* YMP: */
00069 #define BITSIZE_INT1_F90_Y      8   /* Integer (KIND=1) */
00070 #define BITSIZE_INT2_F90_Y     16   /* Integer (KIND=2) */
00071 #define BITSIZE_INT4_F90_Y     32   /* Integer (KIND=4) */
00072 #define BITSIZE_INT6_F90_Y     46   /* Integer (KIND=6), 46-bit value */
00073 #define BITSIZE_INT8_F90_Y     64   /* Integer (KIND=8) */
00074 /* IEEE: */
00075 #define BITSIZE_INT1_F90_IEEE     8   /* Integer (KIND=1) */
00076 #define BITSIZE_INT2_F90_IEEE    16   /* Integer (KIND=2) */
00077 #define BITSIZE_INT4_F90_IEEE    32   /* Integer (KIND=4) */
00078 #define BITSIZE_INT6_F90_IEEE    64   /* Integer (KIND=6) */
00079 #define BITSIZE_INT8_F90_IEEE    64   /* Integer (KIND=8) */
00080 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00081         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00082 #define BITSIZE_INT1_F90                BITSIZE_INT1_F90_IEEE
00083 #define BITSIZE_INT2_F90                BITSIZE_INT2_F90_IEEE
00084 #define BITSIZE_INT4_F90                BITSIZE_INT4_F90_IEEE
00085 #define BITSIZE_INT6_F90                BITSIZE_INT6_F90_IEEE
00086 #define BITSIZE_INT8_F90                BITSIZE_INT8_F90_IEEE
00087 #else
00088 #define BITSIZE_INT1_F90                BITSIZE_INT1_F90_Y
00089 #define BITSIZE_INT2_F90                BITSIZE_INT2_F90_Y
00090 #define BITSIZE_INT4_F90                BITSIZE_INT4_F90_Y
00091 #define BITSIZE_INT6_F90                BITSIZE_INT6_F90_Y
00092 #define BITSIZE_INT8_F90                BITSIZE_INT8_F90_Y
00093 #endif
00094 
00095 /* DIGITS for integer, real, and double precision is number of significant
00096  * digits in bits in the model.
00097  * DIGITS on IEEE is the number of mantissa bits and the implicit bit.
00098  */
00099 /* YMP: */
00100 #define DIGITS_INT1_F90_Y      7   /* Integer (KIND=1) */
00101 #define DIGITS_INT2_F90_Y     15   /* Integer (KIND=2) */
00102 #define DIGITS_INT4_F90_Y     31   /* Integer (KIND=4) */
00103 #define DIGITS_INT6_F90_Y     46   /* Integer (KIND=6), 46-bit value */
00104 #define DIGITS_INT8_F90_Y     63   /* Integer (KIND=8) */
00105 #define DIGITS_REAL4_F90_Y    24   /* Real (KIND=4)    */
00106 #define DIGITS_REAL8_F90_Y    47   /* Real (KIND=8)    */
00107 #define DIGITS_REAL16_F90_Y   95   /* Real (KIND=16)   */
00108 /* IEEE: */
00109 #define DIGITS_INT1_F90_IEEE      7   /* Integer (KIND=1) */
00110 #define DIGITS_INT2_F90_IEEE     15   /* Integer (KIND=2) */
00111 #define DIGITS_INT4_F90_IEEE     31   /* Integer (KIND=4) */
00112 #if defined (_CRAY1) && defined(_CRAYIEEE)
00113 /* change DIGITS_INT6_F90_IEEE 50 for Integer (KIND=6) to allow
00114  * values to match as 46 bits across PVP systems
00115  */
00116 #define DIGITS_INT6_F90_IEEE     46   /* Integer (KIND=6) */
00117 #else
00118 #define DIGITS_INT6_F90_IEEE     63   /* Integer (KIND=6) */
00119 #endif
00120 #define DIGITS_INT8_F90_IEEE     63   /* Integer (KIND=8) */
00121 #define DIGITS_REAL4_F90_IEEE    24   /* Real (KIND=4)    */
00122 #define DIGITS_REAL8_F90_IEEE    53   /* Real (KIND=8)    */
00123 #if     defined(_CRAYMPP)
00124 #define DIGITS_REAL16_F90_IEEE   53   /* Real (KIND=16)   */
00125 #elif   defined(__mips)
00126 #define DIGITS_REAL16_F90_IEEE  107   /* Real (KIND=16)   */
00127 #elif   defined(_LITTLE_ENDIAN) && !defined(__sv2)
00128 #define DIGITS_REAL16_F90_IEEE   64   /* Real (KIND=16)   */
00129 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
00130         (defined(_LITTLE_ENDIAN)  && defined(__sv2))
00131 #define DIGITS_REAL16_F90_IEEE  113   /* Real (KIND=16)   */
00132 #endif
00133 
00134 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00135         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00136 #define DIGITS_INT1_F90         DIGITS_INT1_F90_IEEE
00137 #define DIGITS_INT2_F90         DIGITS_INT2_F90_IEEE
00138 #define DIGITS_INT4_F90         DIGITS_INT4_F90_IEEE
00139 #define DIGITS_INT6_F90         DIGITS_INT6_F90_IEEE
00140 #define DIGITS_INT8_F90         DIGITS_INT8_F90_IEEE
00141 #define DIGITS_REAL4_F90        DIGITS_REAL4_F90_IEEE
00142 #define DIGITS_REAL8_F90        DIGITS_REAL8_F90_IEEE
00143 #define DIGITS_REAL16_F90       DIGITS_REAL16_F90_IEEE
00144 #else
00145 #define DIGITS_INT1_F90         DIGITS_INT1_F90_Y
00146 #define DIGITS_INT2_F90         DIGITS_INT2_F90_Y
00147 #define DIGITS_INT4_F90         DIGITS_INT4_F90_Y
00148 #define DIGITS_INT6_F90         DIGITS_INT6_F90_Y
00149 #define DIGITS_INT8_F90         DIGITS_INT8_F90_Y
00150 #define DIGITS_REAL4_F90        DIGITS_REAL4_F90_Y
00151 #define DIGITS_REAL8_F90        DIGITS_REAL8_F90_Y
00152 #define DIGITS_REAL16_F90       DIGITS_REAL16_F90_Y
00153 #endif
00154 
00155 /* EPSILON for real and double precision
00156  * number that is almost negligible compared to one in the model
00157  * Real result = (b)**(1-p) = 2**(-46) where p = 47
00158  * real (KIND=4) = 377534000000000000000
00159  * real (KIND=8) = 377234000000000000000
00160  * real (KIND=16) is 2**(p-1) = 2**(-94) where p = 95
00161  * or 376434000000000000000 0000000000000000000000
00162  * 
00163  * HEX values for EPSILON are:
00164  *
00165  * YMP:  EPSILON (in hex)                    IEEE: EPSILON (in hex)
00166  * R*4     3FEA800000000000                |         34000000
00167  * R*8     3FD3800000000000                | 3CB0000000000000
00168  * R*16    3FA3800000000000,0              | 3F8F000000000000,0
00169  *
00170  * SGI HEX for R*16
00171  * R*16                                    | 3950000000000000
00172  *                                         | 0000000000000000
00173  *
00174  * LE non-sv2 HEX for R*16
00175  * R*16                                    | 3C00000000000000
00176  *                                         | 0000000000000000
00177  */
00178 
00179 /* YMP: */
00180 #define EPSILON_REAL4_F90_Y  0.1192092895507812e-06
00181 #define EPSILON_REAL8_F90_Y  0.1421085471520200e-13
00182 #define EPSILON_REAL16_F90_Y 0.50487097934144755546350628178090e-28L
00183 /* IEEE: */
00184 #define EPSILON_REAL4_F90_IEEE 1.192092895507812500E-07 /* Real(KIND=4)= */
00185                                                         /* 2**-23 */
00186 #define EPSILON_REAL8_F90_IEEE 2.220446049250313081E-16 /* Real(KIND=8)= */
00187                                                         /* 2**-52 */
00188 #if     defined(_CRAYMPP)
00189 #define EPSILON_REAL16_F90_IEEE 2.220446049250313081E-16 /* Real(KIND=8)= */
00190 #elif   defined(__mips)
00191 #define EPSILON_REAL16_F90_IEEE 1.2325951644078309459558258832543534800E-32L
00192 #elif   defined(_LITTLE_ENDIAN) && !defined(__sv2)
00193 #define EPSILON_REAL16_F90_IEEE 1.08420217248550443400745E-19L
00194                                                         /* 2**-63 */
00195 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
00196         (defined(_LITTLE_ENDIAN) && defined(__sv2))
00197                                                         /* 2**-52 */
00198 #define EPSILON_REAL16_F90_IEEE 1.925929944387235853055977942584927319E-34L
00199                                               /* Real(KIND=16)=2**-112 */
00200 #endif
00201 
00202 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00203         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00204 #define EPSILON_REAL4_F90       EPSILON_REAL4_F90_IEEE
00205 #define EPSILON_REAL8_F90       EPSILON_REAL8_F90_IEEE
00206 #define EPSILON_REAL16_F90      EPSILON_REAL16_F90_IEEE
00207 #else
00208 #define EPSILON_REAL4_F90       EPSILON_REAL4_F90_Y
00209 #define EPSILON_REAL8_F90       EPSILON_REAL8_F90_Y
00210 #define EPSILON_REAL16_F90      EPSILON_REAL16_F90_Y
00211 #endif
00212 
00213 /* HUGE for integer, real and double precision in the model. 
00214  * Integer result = (r**q)-1
00215  * Real result = b**emax*(1-b**(-p))
00216  * 
00217  * HEX values for HUGE:
00218  *
00219  * YMP:  HUGE (in hex)                       IEEE: HUGE (in hex)
00220  * I*1                   7F                |               7F
00221  * I*2                 7FFF                |             7FFF
00222  * I*4             7FFFFFFF                |         7FFFFFFF
00223  * ----------------------------------------  FOR MPP and SPARC, ieee
00224  * I*6         3FFFFFFFFFFF                |         7FFFFFFF
00225  * ----------------------------------------  FOR CRAY-TS,IEEE
00226  * OLD:
00227  * I*6         3FFFFFFFFFFF                |    3FFFFFFFFFFFF
00228  * NEW:
00229  * I*6         3FFFFFFFFFFF                |     3FFFFFFFFFFF
00230  * -------------------------------------------------------------------
00231  * I*8     7FFFFFFFFFFFFFFF                | 7FFFFFFFFFFFFFFF
00232  * R*4     5FFDFFFFFF000000                |         7F7FFFFF
00233  * R*8     5FFDFFFFFFFFFFFE                | 7FEFFFFFFFFFFFFF
00234  * R*16    5FFDFFFFFFFFFFFE                | 7FFEFFFFFFFFFFFF
00235  *             FFFFFFFFFFFF                | FFFFFFFFFFFFFFFF
00236  *
00237  * SGI HEX for R*16
00238  * R*16                                    | 7FE0000000000000
00239  *                                         | F930000000000000
00240  * LARGEST:
00241  * R*16                                    | 7FEFFFFFFFFFFFFF
00242  *                                         | 7C8FFFFFFFFFFFFF
00243  */
00244 
00245 /* YMP: */
00246 #define HUGE_INT1_F90_Y              127          /* integer (KIND=1) */
00247 #define HUGE_INT2_F90_Y            32767          /* integer (KIND=2) */
00248 #define HUGE_INT4_F90_Y       2147483647          /* integer (KIND=4) */
00249 #define HUGE_INT6_F90_Y   70368744177663          /* integer (KIND=6) */
00250                                                   /* 46-bit */
00251 #define HUGE_INT8_F90_Y   9223372036854775807     /* integer (KIND=8) */
00252 #define HUGE_REAL4_F90_Y  0.13634350882572e+2466  /* 0577757777777600000000 */
00253 #define HUGE_REAL8_F90_Y  0.136343516952426e+2466 /* 0577757777777777777776 */
00254 #define HUGE_REAL16_F90_Y 0.1363435169524269911828730305882e+2466L
00255                                                   /* 0577757777777777777777 */
00256                                                   /*       7777777777777776 */
00257 /* IEEE: */
00258 #define HUGE_INT1_F90_IEEE                  127  /* Integer (KIND=1) */
00259 #define HUGE_INT2_F90_IEEE                32767  /* Integer (KIND=2) */
00260 #define HUGE_INT4_F90_IEEE           2147483647  /* Integer (KIND=4) */
00261 #ifdef _WORD32
00262 #define HUGE_INT6_F90_IEEE 9223372036854775807LL /* Integer (KIND=6) */
00263 #define HUGE_INT8_F90_IEEE 9223372036854775807LL /* Integer (KIND=8) */
00264 #elif defined (_CRAY1) && defined(_CRAYIEEE)
00265 /* Change HUGE_INT6_F90_IEEE 1125899906842623L for Integer (KIND=6)
00266  * to allow values to match as 46 bits across PVP architectures.
00267  */
00268 #define HUGE_INT6_F90_IEEE      70368744177663L /* integer (KIND=6) */
00269 #define HUGE_INT8_F90_IEEE 9223372036854775807L /* Integer (KIND=8) */
00270 #else
00271 #define HUGE_INT6_F90_IEEE 9223372036854775807L /* Integer (KIND=6) */
00272 #define HUGE_INT8_F90_IEEE 9223372036854775807L /* Integer (KIND=8) */
00273 #endif
00274 #define HUGE_REAL4_F90_IEEE   3.4028234663852886e+38   /* Real (KIND=4) */
00275 #define HUGE_REAL8_F90_IEEE   1.7976931348623158e+308  /* Real (KIND=8) */
00276 #if     defined(_CRAYMPP) || (defined(_LITTLE_ENDIAN) && !defined(__sv2))
00277 #define HUGE_REAL16_F90_IEEE  1.7976931348623158e+308  /* Real (KIND=8) */
00278 #elif   defined(__mips)
00279 /* define HUGE_REAL16_F90_IEEE 1.7976931348623158079372897140530230000E308L */
00280 #define HUGE_REAL16_F90_IEEE 8.98846567431157953864652595394506827E307L
00281 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
00282         (defined(_LITTLE_ENDIAN) && defined(__sv2))
00283 #define HUGE_REAL16_F90_IEEE  1.189731495357231765085759326628007016E+4932L
00284                                                 /* Real (KIND=16) */
00285 #endif
00286 
00287 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00288         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00289 #define HUGE_INT1_F90           HUGE_INT1_F90_IEEE
00290 #define HUGE_INT2_F90           HUGE_INT2_F90_IEEE
00291 #define HUGE_INT4_F90           HUGE_INT4_F90_IEEE
00292 #define HUGE_INT6_F90           HUGE_INT6_F90_IEEE
00293 #define HUGE_INT8_F90           HUGE_INT8_F90_IEEE
00294 #define HUGE_REAL4_F90          HUGE_REAL4_F90_IEEE
00295 #define HUGE_REAL8_F90          HUGE_REAL8_F90_IEEE
00296 #define HUGE_REAL16_F90         HUGE_REAL16_F90_IEEE
00297 #else
00298 #define HUGE_INT1_F90           HUGE_INT1_F90_Y
00299 #define HUGE_INT2_F90           HUGE_INT2_F90_Y
00300 #define HUGE_INT4_F90           HUGE_INT4_F90_Y
00301 #define HUGE_INT6_F90           HUGE_INT6_F90_Y
00302 #define HUGE_INT8_F90           HUGE_INT8_F90_Y
00303 #define HUGE_REAL4_F90          HUGE_REAL4_F90_Y
00304 #define HUGE_REAL8_F90          HUGE_REAL8_F90_Y
00305 #define HUGE_REAL16_F90         HUGE_REAL16_F90_Y
00306 #endif
00307 
00308 /* MAXEXPONENT = emax of real and double precision in the model */
00309 /* YMP: */
00310 #define MAXEXPONENT_F90_Y               8189
00311 #define MAXEXPONENT_REAL4_F90_Y         8189
00312 #define MAXEXPONENT_REAL8_F90_Y         8189
00313 #define MAXEXPONENT_REAL16_F90_Y        8189
00314 /* IEEE: */
00315 #define MAXEXPONENT_REAL4_F90_IEEE       128
00316 #define MAXEXPONENT_REAL8_F90_IEEE      1024
00317 #if     defined(_CRAYMPP) || defined(__mips)
00318 #define MAXEXPONENT_REAL16_F90_IEEE     1023
00319 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
00320         (defined(_LITTLE_ENDIAN) && defined(__sv2))
00321 #define MAXEXPONENT_REAL16_F90_IEEE     16384
00322 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2)
00323 #define MAXEXPONENT_REAL16_F90_IEEE     16383
00324 #endif
00325 
00326 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00327         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00328 #define MAXEXPONENT_REAL4_F90   MAXEXPONENT_REAL4_F90_IEEE
00329 #define MAXEXPONENT_REAL8_F90   MAXEXPONENT_REAL8_F90_IEEE
00330 #define MAXEXPONENT_REAL16_F90  MAXEXPONENT_REAL16_F90_IEEE
00331 #else
00332 #define MAXEXPONENT_F90         MAXEXPONENT_F90_Y
00333 #define MAXEXPONENT_REAL4_F90   MAXEXPONENT_REAL4_F90_Y
00334 #define MAXEXPONENT_REAL8_F90   MAXEXPONENT_REAL8_F90_Y
00335 #define MAXEXPONENT_REAL16_F90  MAXEXPONENT_REAL16_F90_Y
00336 #endif
00337 
00338 /* MINEXPONENT = emin of real and double precision in the model.
00339  * For mips do not use the following unless the denormal in the
00340  * second word is handled consistently across all hardware.  The
00341  * option to speed up the real(16) will not cause the second word
00342  * to become zero.
00343  *         MINEXPONENT_REAL16_F90_IEEE   -967
00344  * For now, use 1022 - 107 = 915.
00345  */
00346 /* YMP: */
00347 #define MINEXPONENT_F90_Y               -8188
00348 #define MINEXPONENT_REAL4_F90_Y         -8188
00349 #define MINEXPONENT_REAL8_F90_Y         -8188
00350 #define MINEXPONENT_REAL16_F90_Y        -8188
00351 /* IEEE: */
00352 #define MINEXPONENT_REAL4_F90_IEEE       -125
00353 #define MINEXPONENT_REAL8_F90_IEEE      -1021
00354 #if     defined(_CRAYMPP)
00355 #define MINEXPONENT_REAL16_F90_IEEE     -1021
00356 #elif   defined(__mips)
00357 #define MINEXPONENT_REAL16_F90_IEEE      -915
00358 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
00359         (defined(_LITTLE_ENDIAN) && defined(__sv2))
00360 #define MINEXPONENT_REAL16_F90_IEEE    -16381
00361 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2)
00362 #define MINEXPONENT_REAL16_F90_IEEE    -16382
00363 #endif 
00364 
00365 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00366         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00367 #define MINEXPONENT_REAL4_F90   MINEXPONENT_REAL4_F90_IEEE
00368 #define MINEXPONENT_REAL8_F90   MINEXPONENT_REAL8_F90_IEEE
00369 #define MINEXPONENT_REAL16_F90  MINEXPONENT_REAL16_F90_IEEE
00370 #else
00371 #define MINEXPONENT_F90         MINEXPONENT_F90_Y
00372 #define MINEXPONENT_REAL4_F90   MINEXPONENT_REAL4_F90_Y
00373 #define MINEXPONENT_REAL8_F90   MINEXPONENT_REAL8_F90_Y
00374 #define MINEXPONENT_REAL16_F90  MINEXPONENT_REAL16_F90_Y
00375 #endif
00376 
00377 /* PRECISION for decimal precision of real and double precision in the model.
00378  * Result=INT((p-1)*LOG10(b))+k.  K is one if b is an integral power of 10,
00379  *                                otherwise, k=0.
00380  */
00381 /* YMP: */
00382 #define PRECISION_REAL4_F90_Y   6                   /* real (KIND=4) */
00383 #define PRECISION_REAL8_F90_Y  13                   /* real (KIND=8) */
00384 #define PRECISION_REAL16_F90_Y 28                   /* real (KIND=16) */
00385 /* IEEE: */
00386 #define PRECISION_REAL4_F90_IEEE    6                  /* real (KIND=4) */
00387 #define PRECISION_REAL8_F90_IEEE   15                  /* real (KIND=8) */
00388 #if     defined(_CRAYMPP)
00389 #define PRECISION_REAL16_F90_IEEE  15                  /* real (KIND=16) */
00390 #elif   defined(__mips)
00391 #define PRECISION_REAL16_F90_IEEE  31                /* real (KIND=16) */
00392 #elif   defined(_LITTLE_ENDIAN) && !defined(__sv2)
00393 #define PRECISION_REAL16_F90_IEEE  18                /* real (KIND=16) */
00394 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
00395         (defined(_LITTLE_ENDIAN) && defined(__sv2))
00396 #define PRECISION_REAL16_F90_IEEE  33                /* real (KIND=16) */
00397 #endif
00398 
00399 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00400         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00401 #define PRECISION_REAL4_F90     PRECISION_REAL4_F90_IEEE
00402 #define PRECISION_REAL8_F90     PRECISION_REAL8_F90_IEEE
00403 #define PRECISION_REAL16_F90    PRECISION_REAL16_F90_IEEE
00404 #else
00405 #define PRECISION_REAL4_F90     PRECISION_REAL4_F90_Y
00406 #define PRECISION_REAL8_F90     PRECISION_REAL8_F90_Y
00407 #define PRECISION_REAL16_F90    PRECISION_REAL16_F90_Y
00408 #endif
00409 
00410 /* RADIX for integer, real and double precision in the model. */
00411 /* YMP: */
00412 #define RADIX_F90_Y             2
00413 /* IEEE: */
00414 #define RADIX_F90_IEEE          2
00415 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00416         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00417 #define RADIX_F90               RADIX_F90_IEEE
00418 #else
00419 #define RADIX_F90               RADIX_F90_Y             
00420 #endif
00421 
00422 /* RANGE for integer, real and double precision, complex and double complex
00423  * in the model
00424  * Integer result = INT(LOG10 (huge)) where huge is the largest positive
00425  *                  integer in the  model of the same kind.
00426  * Real result = INT(MIN(LOG10 (huge),-LOG10(tiny))) where huge and tiny are
00427  *               the largest and smallest positive numbers in the model of the
00428  *               same kind.
00429  * For mips, do not use 291 until the option to turn off the slower
00430  * handling of denormals is not used.  Until that time the second word
00431  * of a small number could change and thus not indicative of the correct
00432  * significance of the small number.  Save the following for the future:
00433  *  RANGE_REAL16_F90_IEEE  291
00434  */
00435 /* YMP: */
00436 #define RANGE_INT1_F90_Y         2
00437 #define RANGE_INT2_F90_Y         4
00438 #define RANGE_INT4_F90_Y         9
00439 #define RANGE_INT6_F90_Y        13
00440 #define RANGE_INT8_F90_Y        18
00441 #define RANGE_REAL_F90_Y      2465
00442 #define RANGE_REAL4_F90_Y     2465
00443 #define RANGE_REAL8_F90_Y     2465
00444 #define RANGE_REAL16_F90_Y    2465
00445 /* IEEE: */
00446 #define RANGE_INT1_F90_IEEE      2
00447 #define RANGE_INT2_F90_IEEE      4
00448 #define RANGE_INT4_F90_IEEE      9
00449 #if defined (_CRAY1) && defined(_CRAYIEEE)
00450 /* change RANGE_INT6_F90_IEEE 15 for Integer (KIND=6) to allow
00451  * values to match as 46 bits across PVP systems
00452  */
00453 #define RANGE_INT6_F90_IEEE     13
00454 #else
00455 #define RANGE_INT6_F90_IEEE     18
00456 #endif
00457 #define RANGE_INT8_F90_IEEE     18
00458 #define RANGE_REAL4_F90_IEEE    37
00459 #define RANGE_REAL8_F90_IEEE   307
00460 #if     defined(_CRAYMPP) || defined(_LITTLE_ENDIAN)
00461 #define RANGE_REAL16_F90_IEEE  307
00462 #elif   defined(__mips)
00463 #define RANGE_REAL16_F90_IEEE  275
00464 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
00465         (defined(_LITTLE_ENDIAN) && defined(__sv2))
00466 #define RANGE_REAL16_F90_IEEE  4931
00467 #endif
00468 
00469 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00470         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00471 #define RANGE_INT1_F90          RANGE_INT1_F90_IEEE     /* Integer (KIND=1) */
00472 #define RANGE_INT2_F90          RANGE_INT2_F90_IEEE     /* Integer (KIND=2) */
00473 #define RANGE_INT4_F90          RANGE_INT4_F90_IEEE     /* Integer (KIND=4) */
00474 #define RANGE_INT6_F90          RANGE_INT6_F90_IEEE     /* Integer (KIND=6) */
00475 #define RANGE_INT8_F90          RANGE_INT8_F90_IEEE     /* Integer (KIND=8) */
00476 #define RANGE_REAL4_F90         RANGE_REAL4_F90_IEEE    /* real (KIND=4)  */
00477 #define RANGE_REAL8_F90         RANGE_REAL8_F90_IEEE    /* real (KIND=8)  */
00478 #define RANGE_REAL16_F90        RANGE_REAL16_F90_IEEE   /* real (KIND=16) */
00479 #else
00480 #define RANGE_INT1_F90          RANGE_INT1_F90_Y      /* Integer (KIND=1) */
00481 #define RANGE_INT2_F90          RANGE_INT2_F90_Y      /* Integer (KIND=2) */
00482 #define RANGE_INT4_F90          RANGE_INT4_F90_Y      /* Integer (KIND=4) */
00483 #define RANGE_INT6_F90          RANGE_INT6_F90_Y      /* Integer (KIND=6) */
00484 #define RANGE_INT8_F90          RANGE_INT8_F90_Y      /* Integer (KIND=8) */
00485 #define RANGE_REAL_F90          RANGE_REAL_F90_Y     /* real (KIND=4)  */
00486 #define RANGE_REAL4_F90         RANGE_REAL4_F90_Y     /* real (KIND=4)  */
00487 #define RANGE_REAL8_F90         RANGE_REAL8_F90_Y     /* real (KIND=8)  */
00488 #define RANGE_REAL16_F90        RANGE_REAL16_F90_Y    /* real (KIND=16) */
00489 #endif
00490 
00491 /* TINY for real and double precision is the smallest number in the model.
00492  * Result is b**(emin-1)
00493  *
00494  * HEX values for TINY:
00495  *
00496  * YMP:  TINY (in hex)                       IEEE: TINY (in hex)
00497  * R*4     2004800000000000                |           800000
00498  * R*8     2004800000000000                |   10000000000000
00499  * R*16    2004800000000000                |    1000000000000
00500  *                        0                |                0
00501  *
00502  * SGI HEX for R*16
00503  * R*16                                    |  6B0000000000000
00504  *                                         | 0000000000000000
00505  * Tiny for double-double (real(kind=16) for mips must be less than
00506  * TINY_REAL16_F90_IEEE 4.008336720017945555992216102700324100E-292L
00507  * since the use of an exponent in the range of -967 could cause the
00508  * second word to change and thus the entire value would be incorrect.
00509  * If the denormals in the second word get handled correctly across
00510  * all sgi platforms, then change TINY to the larger value and:
00511  *
00512  * SGI HEX for R*16
00513  * R*16                                    |  370000000000000
00514  *                                         | 0000000000000000
00515  *
00516  * For now, use 1022 - 107 = 915 as the minexponent.
00517  *
00518  */
00519 
00520 /* YMP: */
00521 #define TINY_REAL4_F90_Y   0.73344154702194e-2465 /* 0200044000000000000000 */
00522 #define TINY_REAL8_F90_Y   0.73344154702194e-2465 /* 0200044000000000000000 */
00523 #define TINY_REAL16_F90_Y  0.733441547021938866248564956819e-2465L
00524                                                    /* 0200044000000000000000 */
00525                                                    /* 0000000000000000000000 */
00526 /* IEEE: */
00527 #define TINY_REAL4_F90_IEEE   1.175494350822287508E-38 /* 2**(-125-1) */
00528 #define TINY_REAL8_F90_IEEE   2.225073858507201383E-308 /* 2**(-1021-1) */
00529 #if     defined(_CRAYMPP) || defined(_LITTLE_ENDIAN)
00530 #define TINY_REAL16_F90_IEEE  2.225073858507201383E-308 /* 2***(-1021-1) */
00531 #elif   defined(__mips)
00532 #define TINY_REAL16_F90_IEEE 1.8051943758648295760692620811737470000E-276L
00533 #elif   defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE))
00534 #define TINY_REAL16_F90_IEEE 3.362103143112093506262677817321752603E-4932L
00535                                                         /* 2**-16382 */
00536 #endif
00537 
00538 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
00539         (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
00540 #define TINY_REAL4_F90  TINY_REAL4_F90_IEEE  /* real (KIND=4) */
00541 #define TINY_REAL8_F90  TINY_REAL8_F90_IEEE  /* real (KIND=8) */
00542 #define TINY_REAL16_F90 TINY_REAL16_F90_IEEE /* real (KIND=16) */
00543 #else
00544 #define TINY_REAL4_F90  TINY_REAL4_F90_Y     /* real (KIND=4) */
00545 #define TINY_REAL8_F90  TINY_REAL8_F90_Y     /* real (KIND=8) */
00546 #define TINY_REAL16_F90 TINY_REAL16_F90_Y    /* real (KIND=16) */
00547 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines