TITLE DRAND DOUBLE PRECISON RANDOM NUMBER SUBTTL V.001 R.S.TOMLINSON. 19 AUG 68 ENTRY DRAND INTERN DRAND EXTERN RAND,DFA.2,DFM.0,DFA.0 ; CALL: JSA 16,DRAND ; ARG 06, ; ARG 06, ; RESULT RETURNED IN AC 0,1 ; USES PUSH DOWN POINTER IN AC 17 DRAND: 0 JSA 16,RAND ; GET 36 RANDOM BITS PUSH 17,0 ; SAVE THEM JSA 16,RAND ; GET 36 MORE RANDOM BITS JFFO 0,DRAND1 ; COUNT LEADING ZEROES AND JUMP IF NOT ALL ZERO POP 17,1 ; CHECK LOW ORDER WORD JFFO 1,DRAND4 ; COUNT LEADING ZEROES AND JUMP IF NON-ZERO DRAND3: PUSH 17,16 ; SAVE AC 16 MOVEI 3,@0(16) ; LOAD AC 3 WITH ADR OF LOWER LIMIT MOVE 2,0(3) ; PUT LOWER LIMIT INTO AC 2,3 MOVE 3,1(3) DFN 2,3 ; COMPLEMENT LOWER LIMIT MOVEI 16,@1(16) ; LOAD AC 16 WITH ADR OF UPPER LIMIT PUSHJ 17,DFA.2 ; FORM - MOVEI 16,2 PUSHJ 17,DFM.0 ; TIMES RANDOM NUMBER FROM 0.0 TO 1.0 MOVE 16,(17) ; RESTORE AC 16 HRRZ 16,0(16) ; LOAD AC 16 WITH ADR OF LOWER LIMIT PUSHJ 17,DFA.0 POP 17,16 ; RESTORE AC 16 JRA 16,2(16) ; RETURN DRAND1: MOVE 2,1 ; SAVE LEADING ZERO COUNT IN AC 2 POP 17,1 ; GET LOW ORDER WORD JRST DRAND2 DRAND4: ADDI 2,^D36 DRAND2: LSHC 0,-9(2) ; PUT HIGH ORDER ONE IN BIT 9 LSH 1,-9 ; CLEAR SIGN AND EXPONENT BITS MOVN 2,2 FSC 0,200(2) FSC 1,200-^D27(2) JRST DRAND3 END