-- file: MFMathImpl2.mesa -- Pascal-to-Mesa translator output, translated at October 31, 1985 4:28:01 pm PST DIRECTORY PascalBasic, PascalWizardFiles, MFTypes, MFInteraction, MFMath; MFMathImpl2: PROGRAM IMPORTS PascalBasic, MFInteraction, MFMath EXPORTS MFMath = PUBLIC BEGIN OPEN PascalBasic, PascalWizardFiles, MFTypes, MFInteraction, MFMath; RoundFraction: PROCEDURE[X: Fraction] RETURNS[RoundFractionResult: Scaled] = BEGIN BeCareful:PascalInteger; IF X>=2048 THEN RoundFractionResult_1+( PascalDIVPower2[(X-2048),12]) ELSE IF X>=-2048 THEN RoundFractionResult_0 ELSE BEGIN BeCareful_X+1; RoundFractionResult_-(1+( PascalDIVPower2[(-BeCareful-2048),12])); END; END;--:119----121: SquareRt: PROCEDURE[X: Scaled] RETURNS[SquareRtResult: Scaled] = BEGIN K:SmallNumber;Y, Q:PascalInteger; IF X<=0 THEN--122: BEGIN IF X<0 THEN BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[133]; Print[178]; END;PrintScaled[X];Print[179];BEGIN HelpPtr_2; HelpLine^[1]_180;HelpLine^[0]_181; END;Error[]; END;SquareRtResult_0; END--:122 ELSE BEGIN K_23;Q_2;WHILE X<536870912 DO BEGIN K_K-1;X_X+X+X+X; END ENDLOOP ; IF X<1073741824 THEN Y_0 ELSE BEGIN X_X-1073741824;Y_1; END; DO--123:--X_X+X;Y_Y+Y;IF X>=1073741824 THEN BEGIN X_X-1073741824; Y_Y+1; END;X_X+X;Y_Y+Y-Q;Q_Q+Q; IF X>=1073741824 THEN BEGIN X_X-1073741824;Y_Y+1; END; IF Y>Q THEN BEGIN Y_Y-Q;Q_Q+2; END ELSE IF Y<=0 THEN BEGIN Q_Q-2; Y_Y+Q; END;K_K-1--:123--; IF K=0 THEN EXIT; ENDLOOP;SquareRtResult_ PascalDIVPower2[(Q),1]; END; END;--:121 --124:-- PythAdd: PROCEDURE[A,B: PascalInteger] RETURNS[PythAddResult: PascalInteger] = BEGIN R:Fraction; Big:PascalBoolean; A_ABS[A];B_ABS[B];IF A0 THEN BEGIN IF A<536870912 THEN Big_FALSE ELSE BEGIN A_ PascalDIVPower2[A ,2]; B_ PascalDIVPower2[B ,2];Big_TRUE; END;--125: {WHILE TRUE DO BEGIN R_MakeFraction[B,A];R_TakeFraction[R,R]; IF R=0 THEN GOTO Label30;R_MakeFraction[R,1073741824+R]; A_A+TakeFraction[A+A,R];B_TakeFraction[B,R]; END ENDLOOP ;EXITS Label30 => NULL};--:125--IF Big THEN IF A<536870912 THEN A_A+A+A+A ELSE BEGIN ArithError_TRUE; A_2147483647; END; END;PythAddResult_A; END;--:124----126: PythSub: PROCEDURE[A,B: PascalInteger] RETURNS[PythSubResult: PascalInteger] = BEGIN R:Fraction; Big:PascalBoolean; A_ABS[A];B_ABS[B];IF A<=B THEN--128: BEGIN IF A NULL};--:127--IF Big THEN A_A+A; END;PythSubResult_A; END;--:126----132: MLog: PROCEDURE[X: Scaled] RETURNS[MLogResult: Scaled] = BEGIN Y, Z:PascalInteger;K:PascalInteger; IF X<=0 THEN--134:--BEGIN BEGIN IF Interaction=3 THEN NULL;PrintNl[133]; Print[184]; END;PrintScaled[X];Print[179];BEGIN HelpPtr_2; HelpLine^[1]_185;HelpLine^[0]_181; END;Error[];MLogResult_0; END--:134 ELSE BEGIN Y_1302456860;Z_6581195;WHILE X<1073741824 DO BEGIN X_X+X; Y_Y-93032639;Z_Z-48782; END ENDLOOP ;Y_Y+( PascalDIVPower2[Z ,16]);K_2; WHILE X>1073741828 DO--133:--BEGIN Z_( (X-1)/TwoToThe^[K])+1; WHILE X<1073741824+Z DO BEGIN Z_ PascalDIVPower2[(Z+1),1];K_K+1; END ENDLOOP ;Y_Y+SpecLog^[K]; X_X-Z; END--:133-- ENDLOOP ;MLogResult_ PascalDIVPower2[Y ,3]; END; END;--:132----135: MExp: PROCEDURE[X: Scaled] RETURNS[MExpResult: Scaled] = BEGIN K:SmallNumber;Y, Z:PascalInteger; IF X>174436200 THEN BEGIN ArithError_TRUE;MExpResult_2147483647; END ELSE IF X<-197694359 THEN MExpResult_0 ELSE BEGIN IF X<=0 THEN BEGIN Z_ -8*X;Y_1048576; END ELSE BEGIN IF X<=127919879 THEN Z_1023359037-8*X ELSE Z_8*( 174436200-X);Y_2147483647; END;--136:--K_1; WHILE Z>0 DO BEGIN WHILE Z>=SpecLog^[K]DO BEGIN Z_Z-SpecLog^[K]; Y_Y-1-( (Y-TwoToThe^[K-1])/TwoToThe^[K]); END ENDLOOP ;K_K+1; END--:136-- ENDLOOP ; IF X<=127919879 THEN MExpResult_ PascalDIVPower2[(Y+8),4] ELSE MExpResult_Y; END; END;--:135 --139:-- NArg: PROCEDURE[X,Y: PascalInteger] RETURNS[NArgResult: Angle] = BEGIN Z:Angle;T:PascalInteger; K:SmallNumber;Octant:PascalInteger[1..8]; IF X>=0 THEN Octant_1 ELSE BEGIN X_-X;Octant_2; END; IF Y<0 THEN BEGIN Y_-Y;Octant_Octant+2; END;IF X=536870912 DO BEGIN X_ PascalDIVPower2[(X),1];Y_ PascalDIVPower2[(Y),1]; END ENDLOOP ;Z_0; IF Y>0 THEN BEGIN WHILE X<268435456 DO BEGIN X_X+X;Y_Y+Y; END ENDLOOP ;--143: K_0;DO Y_Y+Y;K_K+1;IF Y>X THEN BEGIN Z_Z+SpecAtan^[K];T_X; X_X+( Y /TwoToThe^[K+K]);Y_Y-T; END; IF K=15 THEN EXIT; ENDLOOP;DO Y_Y+Y;K_K+1; IF Y>X THEN BEGIN Z_Z+SpecAtan^[K];Y_Y-X; END; IF K=26--:143-- THEN EXIT; ENDLOOP; END--:142--;--141:--SELECT Octant FROM 1 =>NArgResult_Z;5 =>NArgResult_94371840-Z; 6 =>NArgResult_94371840+Z;2 =>NArgResult_188743680-Z;4 =>NArgResult_Z-188743680; 8 =>NArgResult_-Z-94371840;7 =>NArgResult_Z-94371840;3 =>NArgResult_-Z; ENDCASE--:141--; END; END; --:139----145:-- NSinCos: PROCEDURE[Z: Angle] = BEGIN K:SmallNumber;Q:PascalInteger[0..7]; R:Fraction;X, Y, T:PascalInteger; WHILE Z<0 DO Z_Z+377487360 ENDLOOP ; Z_ Z MOD 377487360;Q_ Z /47185920;Z_ Z MOD 47185920;X_268435456; Y_X;IF NOT PascalODD[Q] THEN Z_47185920-Z;--147:--K_1; WHILE Z>0 DO BEGIN IF Z>=SpecAtan^[K] THEN BEGIN Z_Z-SpecAtan^[K];T_X; X_ T+Y /TwoToThe^[K];Y_ Y-T /TwoToThe^[K]; END;K_K+1; END ENDLOOP ; IF Y<0 THEN Y_0--:147--;--146:--SELECT Q FROM 0 => NULL;1 =>BEGIN T_X;X_Y;Y_T; END; 2 =>BEGIN T_X;X_-Y;Y_T; END;3 =>X_-X;4 =>BEGIN X_-X;Y_-Y; END; 5 =>BEGIN T_X;X_-Y;Y_-T; END;6 =>BEGIN T_X;X_Y;Y_-T; END;7 =>Y_-Y; ENDCASE--:146--;R_PythAdd[X,Y];NCos_MakeFraction[X,R]; NSin_MakeFraction[Y,R]; END;--:145----149:-- NewRandoms: PROCEDURE = BEGIN K:PascalInteger[0..54];X:Fraction; FOR i:INT IN [ INT[0 ].. INT[23 ]] DO K _ i; X_Randoms^[K]-Randoms^[K+31]; IF X<0 THEN X_X+268435456;Randoms^[K]_X; ENDLOOP; FOR i:INT IN [ INT[24 ].. INT[54 ]] DO K _ i; X_Randoms^[K]-Randoms^[K-24]; IF X<0 THEN X_X+268435456;Randoms^[K]_X; ENDLOOP;JRandom_54; END;--:149 --150:-- InitRandoms: PROCEDURE[Seed: Scaled] = BEGIN J, Jj, K:Fraction;I:PascalInteger[0..54]; J_ABS[Seed];WHILE J>=268435456 DO J_ PascalDIVPower2[(J),1] ENDLOOP ;K_1; FOR i:INT IN [ INT[0 ].. INT[54 ]] DO I _ i; Jj_K;K_J-K;J_Jj;IF K<0 THEN K_K+268435456; Randoms^[ (I*21)MOD 55]_J; ENDLOOP;NewRandoms[];NewRandoms[];NewRandoms[]; END; --:150----151:-- UnifRand: PROCEDURE[X: Scaled] RETURNS[UnifRandResult: Scaled] = BEGIN Y:Scaled; IF JRandom=0 THEN NewRandoms [] ELSE JRandom_JRandom-1; Y_TakeFraction[ABS[X],Randoms^[JRandom]]; IF Y=ABS[X] THEN UnifRandResult_0 ELSE IF X>0 THEN UnifRandResult_Y ELSE UnifRandResult_-Y; END;--:151----152:-- NormRand: PROCEDURE RETURNS[NormRandResult: Scaled] = BEGIN X, U, L:PascalInteger; DO DO IF JRandom=0 THEN NewRandoms [] ELSE JRandom_ JRandom-1;X_TakeFraction[112429,Randoms^[JRandom]-134217728]; IF JRandom=0 THEN NewRandoms [] ELSE JRandom_JRandom-1; U_Randoms^[JRandom]; IF ABS[X]=0 THEN EXIT; ENDLOOP;NormRandResult_X; END; END.