```ary←{⎕IO ⎕ML←0 1                        ⍝ ⍺-ary representation of rational ⍵.
⍵=0:,'0'                            ⍝ 0: special case.
base←|⍺                             ⍝ positive base (-ive suppresses fmt).
sign abs←(×⍵)(|⍵)                   ⍝ sign and absolute value.
exp←⌈base⍟abs                       ⍝ exponent.
man←abs×base*-exp                   ⍝ mantissa.
p q←⌊{⍵ 1÷1∨⍵}man                   ⍝ ⎕ct-approximate rational.

digs←{                              ⍝ ⍺-digits.
⍵=0:(⊃↓0 q⊤⍺)⍬ 1                ⍝ no remainder: exact result.
lim<⍴⍺:(rnd⊃↓0 q⊤⍺)⍬ 0          ⍝ truncated digit sequence.
⍵∊⍺:(⍺ rep ⍵),1                 ⍝ repeat: non-terminating rat.
(⍺,⍵)∇ base×q|⍵                 ⍝ history and remainder.
}                                   ⍝ :: [rems] ∇ rem → digs rep exact

ofmt←{                              ⍝ optional formatting.
(sig exp fix rep rat)←⍵         ⍝ rational number structs.
fmt←⌷∘(⎕D,⎕A)∘⊂                 ⍝ char vec from num vec of ⍺ digits.
lft pad←0⌈1 ¯1×exp              ⍝ digits before and zeros after point.
zro←{⍵,(⍴⍵)↓0}                  ⍝ leading zero if required.
neg←(sig<0)/'¯'                 ⍝ -·················    sign,
nnn←fmt zro lft↑fix,lft⍴rep     ⍝ ·nnn··············    whole part,
fff←fmt(pad/0),lft↓fix⌊base-1   ⍝ ·····fff··········    fraction,
rrr←fmt(0⌈exp-⍴fix)⌽rep         ⍝ ········rrr·······    repeat sequence,
fffrrr←fff opt rrr              ⍝ ·····fffrrrrrr····    optimised rep,
dot←(''≡fffrrr)↓'.'             ⍝ ····.·············    base-ary point,
etc←(×⍴rep)/'...'               ⍝ ··············...·    ellipsis,
cut←rat↓'?'                     ⍝ ·················?    truncation mark,
neg,nnn,dot,fffrrr,etc,cut      ⍝ _nnn.fffrrrrrr...?    formatted numb.
}⍣(⍺>0)                             ⍝ :: ∇ sig exp fix rep rat → [-]

lim←⌈base⍟÷⎕CT⌈2*¯53                ⍝ max number of ⍺-digits.           <V>
rnd←{(¯2↓⍵),+∘(5∘≤)/¯2↑⍵}           ⍝ round-off of last digit.
rep←{(0 1=⊂∨\⍵=⍺)/¨1↑↓0 q⊤⍺}        ⍝ reqular repeating rational sequence.
opt←{(-+/∧\=⌿↑⌽¨⍺ ⍵)↓⍺,⍵,⍵}         ⍝ abcxy vwxy ... → abc, xyvw, xyvw ...

q=1:ofmt sign(exp+1)(,1)⍬ 1         ⍝ base*n: special case.
ofmt sign exp,⍬ digs p×base         ⍝ optional formatting of ⍺-ary number.
}
code_colours

test script

Back to: notes

Back to: Workspaces
```