Convert decimal number to rational: Difference between revisions
Content added Content deleted
m (→{{header|VBA}}) |
Alextretyak (talk | contribs) (Added 11l) |
||
Line 20: | Line 20: | ||
* 0.75 → 3 / 4 |
* 0.75 → 3 / 4 |
||
<br><br> |
<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}}== |
=={{header|Ada}}== |