Convert decimal number to rational: Difference between revisions

Added 11l
(Added 11l)
Line 20:
* 0.75 → 3 / 4
<br><br>
 
=={{header|11l}}==
{{trans|Nim}}
 
<lang 11l>T Rational
Int numerator
Int denominator
 
F (numerator, denominator)
.numerator = numerator
.denominator = denominator
 
F String()
I .denominator == 1
R String(.numerator)
E
R .numerator‘//’(.denominator)
 
F rationalize(x, tol = 1e-12)
V xx = x
V flagNeg = xx < 0.0
I flagNeg
xx = -xx
I xx < 1e-10
R Rational(0, 1)
I abs(xx - round(xx)) < tol
R Rational(Int(xx), 1)
V a = 0
V b = 1
V c = Int(ceil(xx))
V d = 1
V aux1 = 7FFF'FFFF I/ 2
L c < aux1 & d < aux1
V aux2 = (Float(a) + Float(c)) / (Float(b) + Float(d))
I abs(xx - aux2) < tol
L.break
I xx > aux2
a += c
b += d
E
c += a
d += b
V g = gcd(a + c, b + d)
I flagNeg
R Rational(-(a + c) I/ g, (b + d) I/ g)
E
R Rational((a + c) I/ g, (b + d) I/ g)
 
print(rationalize(0.9054054054))
print(rationalize(0.9054054054, 0.0001))
print(rationalize(0.5185185185))
print(rationalize(0.5185185185, 0.0001))
print(rationalize(0.75))
print(rationalize(0.1428571428, 0.001))
print(rationalize(35.000))
print(rationalize(35.001))
print(rationalize(0.9))
print(rationalize(0.99))
print(rationalize(0.909))
print(rationalize(0.909, 0.001))</lang>
 
{{out}}
<pre>
1910136854//2109703391
67//74
983902907//1897527035
14//27
3//4
1//7
35
35001//1000
9//10
99//100
909//1000
10//11
</pre>
 
=={{header|Ada}}==
1,453

edits