Post Reply 
fraction between 2 number, minimum denominator
09-19-2023, 12:19 PM (This post was last modified: 09-19-2023 05:07 PM by Albert Chan.)
Post: #3
RE: fraction between 2 number, minimum denominator
(09-18-2023 11:28 PM)Albert Chan Wrote:  Lua only see binary float, not decimal (*) In that sense, above fraction is correct.

If machine only see Decimal float, there is no bin↔dec conversion errors to worry about.
Within machine precision limits, we could use fast float, instead of exact integers.

Here is HP71B code, fraction = (numerator, denominator (default=1)).
Quote:10 DESTROY ALL @ COMPLEX A,B
20 INPUT "A, B= ";A,B
30 A=A+(0,IMPT(A)=0) @ B=B+(0,IMPT(B)=0)
40 IF IMPT(A*CONJ(B))<0 THEN VARSWAP A,B
50 D=1 @ D2=0 @ CALL DCONV(A,B,D,D2) @ "DCONV= ";D;D2,
60 REPEAT @ D=D+D2 @ UNTIL REPT(A*(D,IP(D*REPT(B)/IMPT(B))))<=0
70 "FRAC = "; (CEIL(D*REPT(A)/IMPT(A)), D)
80 GOTO 20
100 SUB DCONV(A,B,D,D2)
110 A1=REPT(A) @ A2=IMPT(A) @ B1=REPT(B) @ B2=IMPT(B)
120 A0=A1 @ A1=MOD(A1,A2) @ A0=(A0-A1)/A2
130 B0=B1 @ B1=MOD(B1,B2) @ B0=(B0-B1)/B2
140 D=D+(A0-(A1=0))*D2 @ VARSWAP D,D2 ! NEXT CONVERGENT
150 IF A1 AND A0=B0 THEN VARSWAP A1,B2 @ VARSWAP A2,B1 @ GOTO 120

Again, we assumed non-negative inputs.

>run
A, B= 1.8, 1.9
DCONV=  1  4                        FRAC = (9,5)
A, B= 1.8, 1.8
DCONV=  1  4                        FRAC = (9,5)
A, B= 1.8, 1.7
DCONV=  1  3                        FRAC = (7,4)
A, B= 1.8, 1.6
DCONV=  1  2                        FRAC = (5,3)
A, B= 1.8, 1.5
DCONV=  1  1                        FRAC = (3,2)
A, B= (10,7), (13,9)
DCONV=  2  5                        FRAC = (10,7)
A, B= 3.1415, 3.1416
DCONV=  7  99                      FRAC = (333,106)
A, B= .999999999977, .999999999978
DCONV=  1  43478260869      FRAC = (43478260869,43478260870)

Translated code for other decimal machine welcome ...
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
RE: fraction between 2 number, minimum denominator - Albert Chan - 09-19-2023 12:19 PM



User(s) browsing this thread: 1 Guest(s)