⍝ Rational number near real ⍵:
⎕PP ← (1+⎕FR=1287)⊃10 32 ⍝ decf vs binf ⎕PP
rational 0.75 ⍝ three quarters.
3 4
rational ÷3 ⍝ one third.
1 3
rational 9÷16 ⍝ pair of ..
9 16
∨/rational 9÷16 ⍝ .. relatively prime numbers:
1
rational 11÷29 ⍝ pair matches rational of quotient ...
11 29
⍝ ... for all relatively prime pairs:
{⍵≡rational÷/⍵}¨ ∘.,⍨ sieve 2 to 100
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
numbs ← +/¨1⊂ 2 2 2⍴ +\10*-⍳8 ⍝ nested numeric array.
numbs
┌─────────────────┬───────────────────┐
│0.1 0.111 │0.11 0.1111 │
│0.11111 0.1111111│0.111111 0.11111111│
└─────────────────┴───────────────────┘
rational numbs ⍝ rational pairs
┌───────────────┬─────────────────┐
│ 1 111 │ 11 1111 │
│11111 1111111 │111111 11111111 │
├───────────────┼─────────────────┤
│ 10 1000│ 100 10000│
│100000 10000000│1000000 100000000│
└───────────────┴─────────────────┘
numbs ≡ ÷⌿ rational numbs ⍝ round-trip.
1
{{⍵÷∨/⍵}⍵,1} 5÷7 ⍝ using gcd.
5 7
ones ← +\ 10*¯1 to ¯8 ⍝ Gianluigi's examples.
ones
0.1 0.11 0.111 0.1111 0.11111 0.111111 0.1111111 0.11111111
⍉ rational ones
1 10
11 100
111 1000
1111 10000
11111 100000
111111 1000000
1111111 10000000
11111111 100000000
:If ⎕FR=645 ⍝ binary FP only
⍉ rational ones×9
9 10
99 100
999 1000
9999 10000
99999 100000
999999 1000000
9999999 10000000
99999998 99999999
:Else
⍉rational +\ 10*¯1 to ¯14 ⍝ Gianluigi's examples.
1 10
11 100
111 1000
1111 10000
11111 100000
111111 1000000
1111111 10000000
11111111 100000000
111111111 1000000000
1111111111 10000000000
11111111111 100000000000
111111111111 1000000000000
1111111111111 10000000000000
0.99999999999999 9
:EndIf
,⌿ rational ÷/¨ ⍳10 10
┌────┬───┬────┬───┬───┬───┬────┬───┬────┬────┐
│1 1 │1 2│1 3 │1 4│1 5│1 6│1 7 │1 8│1 9 │1 10│
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│2 1 │1 1│2 3 │1 2│2 5│1 3│2 7 │1 4│2 9 │1 5 │
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│3 1 │3 2│1 1 │3 4│3 5│1 2│3 7 │3 8│1 3 │3 10│
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│4 1 │2 1│4 3 │1 1│4 5│2 3│4 7 │1 2│4 9 │2 5 │
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│5 1 │5 2│5 3 │5 4│1 1│5 6│5 7 │5 8│5 9 │1 2 │
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│6 1 │3 1│2 1 │3 2│6 5│1 1│6 7 │3 4│2 3 │3 5 │
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│7 1 │7 2│7 3 │7 4│7 5│7 6│1 1 │7 8│7 9 │7 10│
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│8 1 │4 1│8 3 │2 1│8 5│4 3│8 7 │1 1│8 9 │4 5 │
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│9 1 │9 2│3 1 │9 4│9 5│3 2│9 7 │9 8│1 1 │9 10│
├────┼───┼────┼───┼───┼───┼────┼───┼────┼────┤
│10 1│5 1│10 3│5 2│2 1│5 3│10 7│5 4│10 9│1 1 │
└────┴───┴────┴───┴───┴───┴────┴───┴────┴────┘
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ The following example gave JMS a bit of a fright:
P←×/71 73 79 83 ⍝ product of distinct primes.
Q←×/89 97 101 103 ⍝ product of distinct, distinct primes.
P Q ≡ rational P÷Q ⍝ why doesn't this match?
0
⍝ The problem is that the function finds a simpler rational number
⍝ within comparison tolerance of the IEEE representation of P÷Q:
P,Q ⍝ relatively prime numbers.
33984931 89809099
factors¨P Q ⍝ check factors of P and Q
┌───────────┬─────────────┐
│71 73 79 83│89 97 101 103│
└───────────┴─────────────┘
:If ⎕FR=645
rational P÷Q ⍝ simpler tolerably-equal rational.
7042375 18610288
factors¨ rational P÷Q ⍝ factors of simpler rational
┌─────────────┬───────────────┐
│5 5 5 53 1063│2 2 2 2 1163143│
└─────────────┴───────────────┘
:EndIf
(P÷Q)=÷/rational P÷Q ⍝ which is tolerably equal to P÷Q.
1
⍝ If we restrict tolerance slightly, P,Q is again our best bet:
P Q ≡ 1e¯15 rational P÷Q ⍝ now it matches, phew!
1
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝
:If ⎕FR=645
⍝ ⎕ct-intolerant version for _binary_ floating point:
ratf←{⎕IO ⎕CT←0 ⍝ Exact rational from IEEE double.
digs←16↑⎕D,⎕A ⍝ hex digits.
bits←,⍉2 2 2 2⊤digs⍳hexf ⍵ ⍝ binary floating number.
split←(⍳⍴bits)∊0 1 12 ⍝ split fields: sign exponent mantissa.
bsign bexp bmant←split⊂bits ⍝ bit-vector fields.
sign←bsign/'¯' ⍝ neg sign
exp←¯1022+2⊥bexp ⍝ signed numeric binary exponent.
deco←{↑⍺{⍺+nats ⍺⍺×nats ⍵}/⌽⍵} ⍝ accurate ⍺-decode.
top←2 deco 1,bmant ⍝ numerator.
bot←2*nats 53-exp ⍝ denominator.
sign '',¨top{ ⍝ rational pair, char vectors à la nats.
1∊'13579'∊,↑¯1↑¨⍺ ⍵:⍺ ⍵ ⍝ either number is odd: done.
(⍺÷nats 2)∇ ⍵÷nats 2 ⍝ both even: cancel 2s.
}bot
}
ratf 1234
┌────┬─┐
│1234│1│
└────┴─┘
ratf 0.1
┌────────────────┬─────────────────┐
│3602879701896397│36028797018963968│
└────────────────┴─────────────────┘
ratf 2*¯16
┌─┬─────┐
│1│65536│
└─┴─────┘
ratf ¯0.75
┌──┬─┐
│¯3│4│
└──┴─┘
:EndIf
⍝∇ rational to sieve factors hexf nats
Back to: code
Back to: Workspaces