1: /* 2: # TRIG(3.icon) 3: # 4: # Trigonometric functions 5: # 6: # Ralph E. Griswold and Stephen B. Wampler 7: # 8: # Last modified 8/19/84 9: # 10: */ 11: 12: #include "../h/rt.h" 13: #include <errno.h> 14: 15: int errno; 16: 17: /* 18: * sin(x), x in radians 19: */ 20: Xsin(nargs, arg1, arg0) 21: int nargs; 22: struct descrip arg1, arg0; 23: { 24: int t; 25: union numeric r; 26: double sin(); 27: 28: if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1); 29: mkreal(sin(r.real),&arg0); 30: } 31: Procblock(sin,1) 32: 33: /* 34: * cos(x), x in radians 35: */ 36: Xcos(nargs, arg1, arg0) 37: int nargs; 38: struct descrip arg1, arg0; 39: { 40: int t; 41: union numeric r; 42: double cos(); 43: 44: if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1); 45: mkreal(cos(r.real),&arg0); 46: } 47: Procblock(cos,1) 48: 49: /* 50: * tan(x), x in radians 51: */ 52: Xtan(nargs, arg1, arg0) 53: int nargs; 54: struct descrip arg1, arg0; 55: { 56: int t; 57: double y; 58: union numeric r; 59: double tan(); 60: 61: if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1); 62: y = tan(r.real); 63: if (errno == ERANGE) runerr(252, NULL); 64: mkreal(y,&arg0); 65: } 66: Procblock(tan,1) 67: 68: /* 69: * acos(x), x in radians 70: */ 71: Xacos(nargs, arg1, arg0) 72: int nargs; 73: struct descrip arg1, arg0; 74: { 75: int t; 76: double y; 77: union numeric r; 78: double acos(); 79: 80: if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1); 81: y = acos(r.real); 82: if (errno == EDOM) runerr(251, NULL); 83: mkreal(y,&arg0); 84: } 85: Procblock(acos,1) 86: 87: /* 88: * asin(x), x in radians 89: */ 90: Xasin(nargs, arg1, arg0) 91: int nargs; 92: struct descrip arg1, arg0; 93: { 94: int t; 95: double y; 96: union numeric r; 97: double asin(); 98: 99: if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1); 100: y = asin(r.real); 101: if (errno == EDOM) runerr(251, NULL); 102: mkreal(y,&arg0); 103: } 104: Procblock(asin,1) 105: 106: /* 107: * atan(x), x in radians 108: */ 109: Xatan(nargs, arg1, arg0) 110: int nargs; 111: struct descrip arg1, arg0; 112: { 113: int t; 114: union numeric r; 115: double atan(); 116: 117: if ((t = cvreal(&arg1, &r)) == NULL) runerr(102, &arg1); 118: mkreal(atan(r.real),&arg0); 119: } 120: struct b_iproc Batan = { 121: T_PROC, 122: sizeof(struct b_proc), 123: EntryPoint(Xatan), 124: 1, 125: -1, 126: 0, 127: 0, 128: {4, "atan"} 129: }; 130: 131: /* 132: * atan2(x,y), x, y in radians 133: */ 134: Xatan2(nargs, arg2, arg1, arg0) 135: int nargs; 136: struct descrip arg2, arg1, arg0; 137: { 138: int t; 139: union numeric r1, r2; 140: double atan2(); 141: 142: if ((t = cvreal(&arg2, &r2)) == NULL) runerr(102, &arg2); 143: if ((t = cvreal(&arg1, &r1)) == NULL) runerr(102, &arg1); 144: mkreal(atan2(r1.real,r2.real),&arg0); 145: } 146: Procblock(atan2,2) 147: 148: #define PI 3.14159 149: 150: /* 151: * dtor(x), x in degrees 152: */ 153: Xdtor(nargs, arg1, arg0) 154: int nargs; 155: struct descrip arg1, arg0; 156: { 157: union numeric r; 158: 159: if (cvreal(&arg1, &r) == NULL) runerr(102, &arg1); 160: mkreal(r.real * PI / 180, &arg0); 161: } 162: Procblock(dtor,1) 163: 164: /* 165: * rtod(x), x in radians 166: */ 167: Xrtod(nargs, arg1, arg0) 168: int nargs; 169: struct descrip arg1, arg0; 170: { 171: union numeric r; 172: 173: if (cvreal(&arg1, &r) == NULL) runerr(102, &arg1); 174: mkreal(r.real * 180 / PI, &arg0); 175: } 176: Procblock(rtod,1)