HP Prime program: rounding to a fraction Patrice Unregistered Posts: 274 Threads: 23 Joined: Sep 2007 10-29-2013, 08:31 PM Theses 2 programs are rounding a decimal value to the value of a fraction using Farey series. Use 'a b/c' key to display the fraction. ```EXPORT FareyMax(Vl, DMax) // Round a Vl to the best fraction with denominator < DMax BEGIN LOCAL VlE, Tmp; LOCAL DbN,DbD, FnN,FnD, RsN,RsD,RsE; VlE:= ABS(Vl); DbN:= INT(VlE); DbD:=1; FnN:=DbN+1; FnD:=1; RsN:= ROUND(VlE,0); RsD:= 1; RsE:= ABS(VlE-(RsN/RsD)); WHILE DbD+FnD <= DMax DO Tmp:= (DbN+FnN)/(DbD+FnD); IF RsE > ABS(VlE-Tmp) THEN RsN:= (DbN+FnN); RsD:= (DbD+FnD); RsE:= ABS(VlE-(RsN/RsD)); END; IF Tmp < VlE THEN DbN:= (DbN+FnN); DbD:= (DbD+FnD); ELSE FnN:= (DbN+FnN); FnD:= (DbD+FnD); END; END; RETURN SIGN(Vl)*RsN/RsD; END; EXPORT FareyDelta(Vl, Error) // round Vl to the smallest fraction with |Vl - fraction| < Error BEGIN LOCAL VlE, Tmp; LOCAL DbN,DbD, FnN,FnD, RsN,RsD,RsE; VlE:= ABS(Vl); DbN:= INT(VlE); DbD:=1; FnN:=DbN+1; FnD:=1; RsN:= ROUND(VlE,0); RsD:= 1; RsE:= ABS(VlE-(RsN/RsD)); WHILE RsE > Error DO Tmp:= (DbN+FnN)/(DbD+FnD); IF RsE > ABS(VlE-Tmp) THEN RsN:= (DbN+FnN); RsD:= (DbD+FnD); RsE:= ABS(VlE-(RsN/RsD)); END; IF Tmp < VlE THEN DbN:= (DbN+FnN); DbD:= (DbD+FnD); ELSE FnN:= (DbN+FnN); FnD:= (DbD+FnD); END; END; RETURN SIGN(Vl)*RsN/RsD; END; ``` Joe Horn Unregistered Posts: 153 Threads: 7 Joined: Jun 2008 10-30-2013, 01:11 AM Machine roundoff error causes FareyDelta followed by the [a b/c] button to fail when Error is too small. Example: FareyDelta(pi,1E-11) [a b/c] --> 312689/99532 However, the correct answer is 833719/265381, as can be calculated in CAS by setting epsilon:=1E-11 and executing exact(approx(pi)). This problem can be avoided by having FareyDelta return RsN and RsD explicitly (rather than dividing them, and attempting to reconstruct them with the fraction button), in which case it returns the correct result for the above example. -Joe- Edited: 30 Oct 2013, 1:15 a.m. Patrice Unregistered Posts: 274 Threads: 23 Joined: Sep 2007 10-30-2013, 11:00 PM Hi Joe, Do you prefer this way ? no play with 'a b/c' ```EXPORT FareyMax(Vl, DMax) // Round a Vl to the best fraction with denominator < DMax BEGIN LOCAL VlE, Tmp; LOCAL DbN,DbD, FnN,FnD, RsN,RsD,RsE; VlE:= ABS(Vl); DbN:= INT(VlE); DbD:=1; FnN:=DbN+1; FnD:=1; RsN:= ROUND(VlE,0); RsD:= 1; RsE:= ABS(VlE-(RsN/RsD)); WHILE DbD+FnD <= DMax DO Tmp:= (DbN+FnN)/(DbD+FnD); IF RsE > ABS(VlE-Tmp) THEN RsN:= (DbN+FnN); RsD:= (DbD+FnD); RsE:= ABS(VlE-(RsN/RsD)); END; IF Tmp < VlE THEN DbN:= (DbN+FnN); DbD:= (DbD+FnD); ELSE FnN:= (DbN+FnN); FnD:= (DbD+FnD); END; END; RETURN EXPR("QUOTE("+SIGN(Vl)*RsN+"/"+RsD+")"); END; EXPORT FareyDelta(Vl, Error) // round Vl to the smallest fraction with |Vl - fraction| < Error BEGIN LOCAL VlE, Tmp; LOCAL DbN,DbD, FnN,FnD, RsN,RsD,RsE; VlE:= ABS(Vl); DbN:= INT(VlE); DbD:=1; FnN:=DbN+1; FnD:=1; RsN:= ROUND(VlE,0); RsD:= 1; RsE:= ABS(VlE-(RsN/RsD)); WHILE RsE > Error DO Tmp:= (DbN+FnN)/(DbD+FnD); IF RsE > ABS(VlE-Tmp) THEN RsN:= (DbN+FnN); RsD:= (DbD+FnD); RsE:= ABS(VlE-(RsN/RsD)); END; IF Tmp < VlE THEN DbN:= (DbN+FnN); DbD:= (DbD+FnD); ELSE FnN:= (DbN+FnN); FnD:= (DbD+FnD); END; END; RETURN EXPR("QUOTE("+SIGN(Vl)*RsN+"/"+RsD+")"); END; ``` Joe Horn Unregistered Posts: 153 Threads: 7 Joined: Jun 2008 10-31-2013, 06:16 AM Quote:RETURN EXPR("QUOTE("+SIGN(Vl)*RsN+"/"+RsD+")"); Ah, a thing of beauty! Very nice indeed. « Next Oldest | Next Newest »

 Possibly Related Threads… Thread Author Replies Views Last Post Sending little images to the Prime (...and Program name bug?) Erwin Ried 19 7,319 12-10-2013, 05:35 PM Last Post: Erwin Ried Problem with debug HP prime program, somebody help me? Carlos CM (Mexico) 6 3,330 12-05-2013, 03:07 PM Last Post: Carlos CM (Mexico) HP PRIME: APP program code DISAPPEARS !! Joseph Ec 0 1,204 11-25-2013, 11:35 AM Last Post: Joseph Ec Prime: Placing more than 1 item on the RPN stack in a single program? John Colvin 4 2,249 11-19-2013, 08:59 AM Last Post: Miguel Toro Prime: Program size limited to 64K? Erwin Ried 4 2,026 11-17-2013, 11:42 PM Last Post: Joseph Ec [HP-Prime] Picking elements from a List in a program Jean-Michel 3 1,997 11-15-2013, 04:16 AM Last Post: dg1969 HP Prime: Recommendation for future RPN Program Mode BruceTTT 3 2,143 11-13-2013, 10:03 PM Last Post: BruceTTT HP Prime: run a program in another program Davi Ribeiro de Oliveira 6 2,699 11-11-2013, 08:28 PM Last Post: Davi Ribeiro de Oliveira [prime] Insert a breakpoint in a program for debugging ? Olivier Lecluse 3 1,772 11-09-2013, 09:41 PM Last Post: Joseph Ec HP PRIME: Hide return value from program and swap Edit with Run vrrr 2 1,540 11-09-2013, 04:04 PM Last Post: vrrr

Forum Jump: