Continued fraction: Difference between revisions

Content added Content deleted
(Added code for Liberty Basic)
(Removed Liberty Basic code: Incorrect task)
Line 541: Line 541:
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274
</lang>
</lang>
=={{header|Liberty BASIC}}==
<lang lb>
dim terms(100)
input "Enter a number:";n$
if instr(n$,"/")=0 then
n$=castToFraction$(val(n$))
end if
if castToReal(n$)<=0 then notice "N must be positive!":end
print "[";
if termoverride=0 then
nterms=1
[start]
term=int2(n$):n$=subtract$(n$,castToFraction$(term))
print term;
terms(nterms)=term
if equal(n$,"0/1")=0 then n$=reciprocal$(n$)
if compare(n$,"1/100")=1 and nterms<100 then print ",";:nterms=nterms+1:goto [start]
print "]"
end if
print "Convergents:"
for x=1 to nterms
sum=terms(x)
sum$=castToFraction$(terms(x))
for y=x-1 to 1 step -1
sum=terms(y)+1/sum
sum$=add$(castToFraction$(terms(y)),reciprocal$(sum$))
next y
print sum$;"=";sum
next x


function int2(a$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
int2=int(aNumerator/aDenominator)
end function


function abs$(a$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
bNumerator=abs(aNumerator)
bDenominator=abs(aDenominator)
b$=str$(bNumerator)+"/"+str$(bDenominator)
abs$=simplify$(b$)
end function

function negate$(a$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
bNumerator=-1*aNumerator
bDenominator=aDenominator
b$=str$(bNumerator)+"/"+str$(bDenominator)
negate$=simplify$(b$)
end function

function add$(a$,b$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
bNumerator=val(word$(b$,1,"/"))
bDenominator=val(word$(b$,2,"/"))
cNumerator=(aNumerator*bDenominator+bNumerator*aDenominator)
cDenominator=aDenominator*bDenominator
c$=str$(cNumerator)+"/"+str$(cDenominator)
add$=simplify$(c$)
end function

function subtract$(a$,b$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
bNumerator=val(word$(b$,1,"/"))
bDenominator=val(word$(b$,2,"/"))
cNumerator=(aNumerator*bDenominator-bNumerator*aDenominator)
cDenominator=aDenominator*bDenominator
c$=str$(cNumerator)+"/"+str$(cDenominator)
subtract$=simplify$(c$)
end function

function multiply$(a$,b$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
bNumerator=val(word$(b$,1,"/"))
bDenominator=val(word$(b$,2,"/"))
cNumerator=aNumerator*bNumerator
cDenominator=aDenominator*bDenominator
c$=str$(cNumerator)+"/"+str$(cDenominator)
multiply$=simplify$(c$)
end function

function divide$(a$,b$)
divide$=multiply$(a$,reciprocal$(b$))
end function

function simplify$(a$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
gcd=GCD(aNumerator,aDenominator)
if aNumerator<0 and aDenominator<0 then gcd=-1*gcd
bNumerator=aNumerator/gcd
bDenominator=aDenominator/gcd
b$=str$(bNumerator)+"/"+str$(bDenominator)
simplify$=b$
end function

function reciprocal$(a$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
reciprocal$=str$(aDenominator)+"/"+str$(aNumerator)
end function

function equal(a$,b$)
if simplify$(a$)=simplify$(b$) then equal=1:else equal=0
end function

function castToFraction$(a)
do
exp=exp+1
a=a*10
loop until abs(a-int(a+0.001))<0.001
castToFraction$=simplify$(str$(a)+"/"+str$(10^exp))
end function

function castToReal(a$)
aNumerator=val(word$(a$,1,"/"))
aDenominator=val(word$(a$,2,"/"))
castToReal=aNumerator/aDenominator
end function

function castToInt(a$)
castToInt=int(castToReal(a$))
end function

function compare(a$,b$)
if abs$(subtract$(a$,b$))=subtract$(a$,b$) then compare=1:else compare=-1
end function

function GCD(a,b)
if a=0 then
GCD=1
else
if a>=b then
while b
c = a
a = b
b = c mod b
GCD = abs(a)
wend
else
GCD=GCD(b,a)
end if
end if
end function


</lang>
=={{header|Mathematica}}==
=={{header|Mathematica}}==
<lang Mathematica>
<lang Mathematica>