continued fraction
Mathworld





a

0


+









b

1












a

1


+









b

2












a

2


+









b

3












a

3


+
⋱

















{\displaystyle a_{0}+{\cfrac {b_{1}}{a_{1}+{\cfrac {b_{2}}{a_{2}+{\cfrac {b_{3}}{a_{3}+\ddots }}}}}}}


The task is to write a program which generates such a number and prints a real representation of it. The code should be tested by calculating and printing the square root of 2, Napier's Constant, and Pi, using the following coefficients:

For the square root of 2, use 




a

0


=
1


{\displaystyle a_{0}=1}

 then 




a

N


=
2


{\displaystyle a_{N}=2}

. 




b

N




{\displaystyle b_{N}}

 is always 



1


{\displaystyle 1}

.







2


=
1
+








1









2
+








1









2
+








1









2
+
⋱

















{\displaystyle {\sqrt {2}}=1+{\cfrac {1}{2+{\cfrac {1}{2+{\cfrac {1}{2+\ddots }}}}}}}


For Napier's Constant, use 




a

0


=
2


{\displaystyle a_{0}=2}

, then 




a

N


=
N


{\displaystyle a_{N}=N}

. 




b

1


=
1


{\displaystyle b_{1}=1}

 then 




b

N


=
N
−
1


{\displaystyle b_{N}=N-1}

.





e
=
2
+








1









1
+








1









2
+








2









3
+








3









4
+
⋱






















{\displaystyle e=2+{\cfrac {1}{1+{\cfrac {1}{2+{\cfrac {2}{3+{\cfrac {3}{4+\ddots }}}}}}}}}


For Pi, use 




a

0


=
3


{\displaystyle a_{0}=3}

 then 




a

N


=
6


{\displaystyle a_{N}=6}

. 




b

N


=
(
2
N
−
1

)

2




{\displaystyle b_{N}=(2N-1)^{2}}

.





π
=
3
+








1









6
+








9









6
+








25









6
+
⋱

















{\displaystyle \pi =3+{\cfrac {1}{6+{\cfrac {9}{6+{\cfrac {25}{6+\ddots }}}}}}}




See also

   Continued fraction/Arithmetic for tasks that do arithmetic over continued fractions.


go =>
 
  % square root 2
  continued_fraction(200, sqrt_2_ab, V1),
  printf("sqrt(2) = %w (diff: %0.15f)\n", V1, V1-sqrt(2)),
 
  % napier
  continued_fraction(200, napier_ab, V2),
  printf("e       = %w (diff: %0.15f)\n", V2, V2-math.e),
 
  % pi
  continued_fraction(200, pi_ab, V3),
  printf("pi      = %w (diff: %0.15f)\n", V3, V3-math.pi),
  % get a better precision
  continued_fraction(20000, pi_ab, V3b),
  printf("pi      = %w (diff: %0.15f)\n", V3b, V3b-math.pi),
  nl.
 
continued_fraction(N, Compute_ab, V) ?=>
  continued_fraction(N,  Compute_ab, 0, V).
 
continued_fraction(0,  Compute_ab, Temp, V) ?=>
  call(Compute_ab, 0, A, _),
  V = A + Temp.
 
continued_fraction(N, Compute_ab, Tmp, V) =>
  call(Compute_ab, N, A, B),
  Tmp1 = B / (A + Tmp),
  N1 = N - 1,
  continued_fraction(N1, Compute_ab, Tmp1, V).
 
% definitions for square root of 2
sqrt_2_ab(0, 1, 1).
sqrt_2_ab(_, 2, 1).
 
% definitions for napier
napier_ab(0, 2, _).
napier_ab(1, 1, 1).
napier_ab(N, N, V) :-
	V is N - 1.
 
% definitions for pi
pi_ab(0, 3, _).
pi_ab(N, 6, V) :-
	V is (2 * N - 1)*(2 * N - 1).