|
|
1.1 ! root 1: .TI F77/TO_DOUBLE "Sep. 4, 1985" ! 2: Converting Programs to Double Precision ! 3: ! 4: On VAXs, single precision provides about 6-7 digits of accuracy while ! 5: double precision provides about 15-16 digits of accuracy. ! 6: Many mathematical subroutine libraries assume ! 7: double precision arguments. ! 8: If you have a program written in single precision which needs to be ! 9: run in double precision, you can either use f77's -r8 flag ! 10: to compile it as if it were written in double precision, ! 11: or follow the following steps to convert the source. ! 12: If you use the -r8 flag, you still must check equivalences and ! 13: common blocks as described in paragraph 9 below. ! 14: ! 15: To convert a program from single to double precision: ! 16: ! 17: .IP 1. ! 18: Add 'implicit double precision (a-h,o-z)' ! 19: as the first line of the main program (second line if you have ! 20: a 'program' statement) and as the second line of all other ! 21: subprograms (subroutines, functions, and block data subprograms). ! 22: ! 23: .IP 2. ! 24: Change all 'real' or 'real*4' declarations to 'double precision'. ! 25: ! 26: .IP 3. ! 27: Change single precision floating point constants to double precision, ! 28: either by adding 'd0' or changing an 'e' exponent term to 'd', e.g.: ! 29: .nf ! 30: 1.2 becomes 1.2d0 ! 31: 3.2e-5 becomes 3.2d-5 ! 32: .fi ! 33: ! 34: .IP 4. ! 35: Change 'complex' or 'complex*8' declarations to 'double complex'. ! 36: ! 37: .IP 5. ! 38: Formats do not need to be changed. ! 39: ! 40: .IP 6. ! 41: Change single precision intrinsic functions to double. Because of the ! 42: generic function names in f77, the only ones you need to actually change are: ! 43: ! 44: .nf ! 45: single version: double or generic version: ! 46: ifix() int() ! 47: sngl() dble() ! 48: real() dble() ! 49: float() dble() ! 50: amax1() max() ! 51: amin1() min() ! 52: amod() mod() ! 53: alog() log() ! 54: alog10() log10() ! 55: .fi ! 56: ! 57: .IP 7. ! 58: Change complex intrinsic functions to double complex. ! 59: ! 60: .nf ! 61: complex version: double complex or generic version: ! 62: cmplx() dcmplx() ! 63: aimag() imag() ! 64: csqrt() sqrt() ! 65: cexp() exp() ! 66: clog() log() ! 67: ccos() cos() ! 68: csin() sin() ! 69: cabs() abs() ! 70: .fi ! 71: ! 72: .IP 8. ! 73: If you are passing functions as arguments to other subroutines, ! 74: you need to change all function names to specific functions. ! 75: For example: ! 76: ! 77: .nf ! 78: x1 = sqrt(x2) ! 79: c1 = abs(c2) ! 80: .fi ! 81: ! 82: works fine when x1 and x2 are double and c1 and c2 are double complex. ! 83: However, if the computation is being done in a subroutine, ! 84: ! 85: .nf ! 86: external sqrt, cabs ! 87: call subr( x1, x2, sqrt, c1, c2, cabs ) ! 88: .fi ! 89: ! 90: it must be changed to: ! 91: ! 92: .nf ! 93: external dsqrt, cdabs ! 94: call subr( x1, x2, dsqrt, c1, c2, cdabs ) ! 95: .fi ! 96: ! 97: .IP 9. ! 98: Check equivalences common blocks, and dynamic memory allocation. ! 99: Often these implicitly assume that floating point and integer values ! 100: use the same amount of storage. ! 101: For example, if one subroutine declares: ! 102: ! 103: common /abc/ key1,vec(5),ival ! 104: ! 105: and another declares: ! 106: ! 107: common /abc/ dummy(6), ival ! 108: ! 109: then the two instances of 'ival' match. If you change 'dummy' ! 110: and 'vec' from single precision to double precision (either ! 111: explicitly or via the -r8 flag), the two ! 112: instances of 'ival' will no longer correspond.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.