LB Booster
Programming >> Liberty BASIC language >> more fractions
http://lbb.conforums.com/index.cgi?board=lblang&action=display&num=1488669967

more fractions
Post by tsh73 on Mar 4th, 2017, 10:26pm

Set of functions to work with fractions (+-*/, printing as improper fractions / as mixed numbers, reducing to lower terms)

Feel free to break it ;)
Code:
'set of functions to work with fractions
'tested along this page
'https://www.varsitytutors.com/hotmath/hotmath_help/topics/fraction-operations
'tsh73 march 2017

'1) fractions to be stored as string, "numenator denominator" (to be used by val(word$()))
'   "-" is to be stored at first part
'2) add sub div mul to be created as functions
'3) to visualise, fracToStr$ (actually improper fraction, like 4/3)
'4) to visualise, fracToMixed$ ( 1 1/3)
'5) to use in computations, fracVal

'============================
f1$="1 3"
print fracToStr$(f1$)

f2$=frac$(5, 3)
print fracToStr$(f2$)
print fracToMixed$(f2$)
print fracVal(f2$)
print
print fracToMixed$("8 4")
print fracToMixed$("2 4")
print fracToMixed$("0 4")
print
print toLowestTerms$("3 7")
print toLowestTerms$("45 75")
print
print fracToMixed$(toLowestTerms$("3 7"))
print fracToMixed$(toLowestTerms$("45 75"))
print fracToMixed$(toLowestTerms$("75 45"))
print
print fracAdd$("1 3", "3 7")
print fracAdd$("1 3", "1 2")
print fracAdd$("1 2", "-1 3" )  'hackety hack
print fracAdd$("1 3", "5 3")
print fracToMixed$(fracAdd$("1 3", "5 3"))
print
print fracNegate$("1 2")
print fracNegate$("2 2")
print fracNegate$("3 2")
print fracNegate$("0 2")
print fracToMixed$(fracNegate$("1 2"))
print fracToMixed$(fracNegate$("2 2"))
print fracToMixed$(fracNegate$("3 2"))
print fracToMixed$(fracNegate$("0 2"))
print
print fracSub$("1 3", "3 7")
print fracSub$("1 3", "1 2")
print fracSub$("1 2", "-1 2" )
print fracSub$("1 2", "1 2" )
print fracSub$("1 3", "5 3")
print fracToMixed$(fracSub$("1 3", "5 3"))
print
print fracMul$("1 4", "5 6")
print fracRecipr$("3 4")
print fracDiv$("3 4", "5 7")
print fracToMixed$(fracDiv$("3 4", "5 7"))


'============================
function fracToStr$(frac$)
    num=val(word$(frac$,1))
    if num = 0 then fracToStr$="0": exit function
    'else
    fracToStr$ = word$(frac$,1);"/"; word$(frac$,2)
end function

function frac$(num, denom)
'from numenator denominator
    frac$ = num;" ";denom
end function

function fracToMixed$(frac$)
    fracToMixed$=fracToStr$(frac$)  'default
    num=val(word$(frac$,1))
    denom=val(word$(frac$,2))
    if num <0 then sgn$ = "-": num = 0-num
    if num >= denom then
        intPart = int(num / denom)
        fracToMixed$=sgn$;str$( intPart)
        num = num mod denom
        if num<>0 then fracToMixed$=fracToMixed$;" ";num;"/";denom
    end if
end function

function fracVal(frac$)
    num=val(word$(frac$,1))
    denom=val(word$(frac$,2))
    fracVal = num/denom
end function

function toLowestTerms$(frac$)
    toLowestTerms$ = frac$ 
    num=val(word$(frac$,1))
    denom=val(word$(frac$,2))
    if num <0 then sgn$ = "-": num = 0-num
    gcd = gcd(num, denom)
    if gcd>1 then
        num=num/gcd
        denom=denom/gcd
        toLowestTerms$ = sgn$;num;" ";denom
    END IF
end function

function gcd(a,b)
    while a<>0 and b<>0
        if a>b then
            a = a mod b
        else
            b = b mod a
        end if
    wend
    gcd=a+b
end function

function lcm(m,n)
' least common multiple ( LCM ), for  least common denominator
    lcm = m*n/gcd(m,n)
end function

function fracAdd$(f1$, f2$)
    num1=val(word$(f1$,1))
    denom1=val(word$(f1$,2))
    num2=val(word$(f2$,1))
    denom2=val(word$(f2$,2))
    denom = denom1*denom2
    num = num1*denom2+num2*denom1
    fracAdd$=toLowestTerms$(frac$(num, denom))
end function

function fracNegate$(frac$)
    num=val(word$(frac$,1))
    denom=val(word$(frac$,2))
    fracNegate$ = frac$(0-num, denom)
end function

function fracSub$(f1$, f2$)
    fracSub$ = fracAdd$(f1$, fracNegate$(f2$))
end function

function fracMul$(f1$, f2$)
    num1=val(word$(f1$,1))
    denom1=val(word$(f1$,2))
    num2=val(word$(f2$,1))
    denom2=val(word$(f2$,2))
    denom = denom1*denom2
    num = num1*num2
    fracMul$=toLowestTerms$(frac$(num, denom))
end function

function fracRecipr$(frac$)
    'fracToStr$ = word$(frac$,2);" "; word$(frac$,1)
    num=val(word$(frac$,1))
    denom=val(word$(frac$,2))
    if num <0 then sgn$ = "-": num = 0-num
    fracRecipr$ = sgn$;frac$(denom, num)
end function

function fracDiv$(f1$, f2$)
    fracDiv$=fracMul$(f1$, fracRecipr$(f2$))
end function
 

Re: more fractions
Post by SarmedNafi on Mar 6th, 2017, 2:32pm

Quote:
Feel free to break it wink




Interested functions indeed.
Thank you, Anatoly.

Regards,
Sarmed