Continued fraction/Arithmetic/Construct from rational number: Difference between revisions

Added Wren
(Added Wren)
Line 2,323:
1.5 -> 1,2
23/7 -> 3,3,2
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-rat}}
{{libheader|Wren-fmt}}
<lang ecmascript>import "/rat" for Rat
import "/fmt" for Fmt
 
var toContFrac = Fn.new { |r|
var a = r.num
var b = r.den
while (true) {
Fiber.yield((a/b).truncate)
var t = a % b
a = b
b = t
if (a == 1) return
}
}
 
var groups = [
[ [1, 2], [3, 1], [23, 8], [13, 11], [22, 7], [-151, 77] ],
[ [14142, 1e4], [141421, 1e5], [1414214, 1e6], [14142136, 1e7] ],
[ [31, 10], [314, 100], [3142, 1e3], [31428, 1e4], [314285, 1e5], [3142857, 1e6],
[31428571, 1e7], [314285714,1e8]]
]
 
var lengths = [ [4, 2], [8, 8], [9, 9] ]
var headings = [ "Examples ->", "Sqrt(2) ->", "Pi ->" ]
var i = 0
for (group in groups) {
System.print(headings[i])
for (pair in group) {
Fmt.write("$*d / $*d = ", lengths[i][0], pair[0], -lengths[i][1], pair[1])
var f = Fiber.new(toContFrac)
var r = Rat.new(pair[0], pair[1])
while (!f.isDone) {
var d = f.call(r)
if (d) System.write("%(d) ")
}
System.print()
}
System.print()
i = i + 1
}</lang>
 
{{out}}
<pre>
Examples ->
1 / 2 = 0 2
3 / 1 = 3
23 / 8 = 2 1 7
13 / 11 = 1 5 2
22 / 7 = 3 7
-151 / 77 = -1 -1 -24 -1 -2
 
Sqrt(2) ->
14142 / 10000 = 1 2 2 2 2 2 1 1 29
141421 / 100000 = 1 2 2 2 2 2 2 3 1 1 3 1 7 2
1414214 / 1000000 = 1 2 2 2 2 2 2 2 3 6 1 2 1 12
14142136 / 10000000 = 1 2 2 2 2 2 2 2 2 2 6 1 2 4 1 1 2
 
Pi ->
31 / 10 = 3 10
314 / 100 = 3 7 7
3142 / 1000 = 3 7 23 1 2
31428 / 10000 = 3 7 357
314285 / 100000 = 3 7 2857
3142857 / 1000000 = 3 7 142857
31428571 / 10000000 = 3 7 476190 3
314285714 / 100000000 = 3 7 7142857
</pre>
 
9,486

edits