The Museum of HP Calculators

# Decimal to Fraction for the HP-41

This program is Copyright © 2007 by Jean-Marc Baillard and is used here by permission.

This program is supplied without representation or warranty of any kind. Jean-Marc Baillard and The Museum of HP Calculators therefore assume no responsibility and shall have no liability, consequential or otherwise, of any kind arising from the use of this program material or any part thereof.

## Overview

-The 3 following programs find the best approximations of a decimal number x by a fraction p/q.
-"DF" & "DF2"  are based on continued fractions:

-We define   (pk)  &  (qk)   by  q -1 = 0 ,  q0 = 1 and  qk = yk.qk-1 + qk-2

where         yk = INT(xk)             with  x0 = x ,  xk+1 = 1/FRC(xk)     we have then   pk = RND(x.qk)   [ RND must be executed in FIX 0 ]

-"DF3" uses a more direct - but much slower - approach.

1°) Program#1

-This program displays the successive   pk/qk  and stops when the fraction is exactly equal to x
-Synthetic register M may be replaced by any data register.

Data Registers: /
Flag:   F29
Subroutines: /

01  LBL "DF"
02  SIGN
03  0
04  LASTX
05  ENTER^
06  LBL 01
07  X<> L
08  FRC
09  1/X
10  INT
11  R^
12  ST* Y
13  X<> T
14  ST+ Y
15  X<> L
16  RDN
17  STO M
18  X<>Y
19  ST* Y
20  X<>Y
21  FIX 0
22  CF 29
23  RND
24  R^
25  SIGN
26  X<> M
27  CLA
28  ARCL Y
29  "~/"                               append /
30  ARCL X
31  FIX 4
32  SF 29
33  AVIEW
34  ST/ Y
35  RDN
36  X#Y?
37  GTO 01
38  R^                                 if you don't have an X-Functions module, delete lines 38-39
39  ANUM                         this will change the final outputs, but not the displayed fractions.
40  END

( 67 bytes / SIZE 000 )

 STACK INPUTS when AVIEWs OUTPUTS T / qk-1 qn-1 Z / x x Y / pk qn X x qk pn

Examples:

a)  PI  XEQ "DF"  the hp-41 successively displays  "22/7"  "333/106"   "355/113"   "104348/33215"

-When the program stops,  X-register = 104348
Y-register = 33215

b) 1  E^X  R/S  >>>  "3/1"  "8/3"  "11/4"  "19/7"  "87/32"  "106/39"  "193/71"  "1264/465"  "1457/536"
"2721/1001"  "23225/8544"  "25946/9545"  "49171/18089"  "173459/63812"

and eventually,  X = 173459
Y =  63812

-Some numbers produce many continued fractions:
-A famous example is the golden ratio phi = (1+sqrt(5))/2   "DF" displays 22 fractions before it stops!
-The last one is 75025/46368

-If you set flag F21, the calculator will stop at each AVIEW
-The numerators are then in Y-register and the denominators in X-register
-At the end, X = the numerator, Y = the denominator.

2°) Program#2

-The following routine stops when the rounded  difference ( x - p/q )  equals 0 in the current display format.
-Synthetic registers M N O P may be replaced by any data registers.

Data Registers: /
Flags: /
Subroutines: /

01  LBL "DF2"
02  STO M
03  STO N
04  RCL d             or   RCLFLAG
05  STO O
06  CLST
07  SIGN
08  ENTER^
09  LBL 01
10  X<> N
11  FRC
12  1/X
13  STO N
14  INT
15  RCL Y
16  *
17  R^
18  +
19  RCL M
20  RCL Y
21  *
22  FIX 0
23  RND
24  STO P
25  RCL Y
26  /
27  RCL O
28  STO d             or   STOFLAG
29  CLX
30  RCL M
31  -
32  RND
33  X#0?
34  GTO 01
35  X<> M
36  X<> L
37  STO Z
38  X<> P
39  CLA
40  END

( 68 bytes / SIZE 000 )

 STACK INPUTS OUTPUTS T / qn-1 Z / pn/qn - x Y / qn X x pn L / x

Examples:

FIX 6   PI    XEQ "DF2"  >>>>   355   RDN  113   RDN   2.66 E-7   whence  PI ~ 355/113  and   355/113 - PI  =  2.66 E-7
FIX 6   1    E^X    R/S    >>>>  2721  RDN  1001  RDN  -1.10 E-7   whence  e ~  2721/1001 and  2721/1001 - e = -1.1 E-7

-T = the next to last denominator
-The decimal number x is saved in L-register.

3°) Program#3

-The continued fractions give the most interesting results, and moreover,  very fast.
-However, occasionaly, you might need to know the best fractional approximation p/q of a ( positive ) real x where q is between 2 given integers  q1 & q2
-The program hereunder will give you the answer, but not very fast if q is "great"

Data Registers:   R00 = x   R01 = p    R03 = | x - p/q |       R05 = q2
R02 = q     R04 = q1 , 1+q1 , ..... , q2
Flags: /
Subroutines: /

01  LBL "DF3"
02  STO 00
03  X<>Y
04  STO 05
05  1
06  STO 03
07  R^
08  LBL 01
09  STO 04
10  RCL 00
11  *
12  INT
13  ENTER^
14  ENTER^
15  SIGN
16  LASTX
17  ST+ Y
18  RCL 04
19  ST/ Z
20  /
21  RCL 00
22  ST- Z
23  -
24  ABS
25  X<=Y?
26  GTO 02
27  X<>Y
28  ISG Z
29  LBL 02
30  RCL 03
31  X<=Y?
32  GTO 03
33  X<>Y
34  STO 03
35  R^
36  STO 01
37  RCL 04
38  STO 02
39  LBL 03
40  RCL 05
41  RCL 04
42  1
43  +
44  X<=Y?
45  GTO 01
46  RCL 03
47  RCL 02
48  RCL 01
49  END

( 64 bytes / SIZE 006 )

 STACK INPUTS OUTPUTS Z q1 | x -  p/q | Y q2 q X x p

-We must have  x > 0  and  0 < q1 <= q2

Example:

50   ENTER^
100  ENTER^
PI   XEQ "DF3"  >>>>  p = 311      ( execution time = 45 seconds )
RDN   q = 99
RDN   1.79 E-4    so  311/99  approximates PI with an error of 1.79 E-4 in magnitude.

-This approximation is better than 22/7 but of course less accurate than 333/106