(11C) Arithmetic with Fractions - Printable Version +- HP Forums (https://www.hpmuseum.org/forum) +-- Forum: HP Software Libraries (/forum-10.html) +--- Forum: General Software Library (/forum-13.html) +--- Thread: (11C) Arithmetic with Fractions (/thread-11400.html) Pages: 1 2 (11C) Arithmetic with Fractions - Gamo - 09-15-2018 07:02 AM Program to add, subtract, multiply, divide, simplify to lowest term and convert to mixed fraction. In the form of a/b [+ - x ÷] c/d = e/f If f ˂ e then get the result for Mixed Fraction of g+ h/f Procedure: a [ENTER] b [ENTER] c [ENTER] d [A] [A] Store Fractions [B] For Add or Subtract [C] For Multiply [D] For Divide [E] For Mixed Fraction Each [B] [C] [D] give answer display of e [X<>Y] f as fraction of e/f If f ˂ e press [E] give answer display of g.000h [X<>Y] f of g+ h/f ----------------------------------------------------------------------------------------- Example: 111/33 + 7/17 111 [ENTER] 33 [ENTER] 7 [ENTER] 17 [A] display 0.0000 [B] display 706 [X<>Y] 187 Answer is 706/187 // Answer f ˂ e [E] display 3.0145 [X<>Y] 187 Answer of Mixed Fraction is 3+ 145/187 ----------------------------------------------------------------------------------------- Example: 1001/98 x 123/321 1001 [ENTER] 98 [ENTER] 123 [ENTER] 321 [A] display 0.0000 [C] display 5863 [X<>Y] 1498 Answer is 5863/1498 // Answer f < e [E] display 3.1369 [X<>Y] 1498 Answer of Mixed Fraction is 3+ 1369/1498 ----------------------------------------------------------------------------------------- Program: [Total of 135 program steps] Code:  LBL A  // For Fraction input STO 4 Rv STO 3 Rv STO 2 Rv STO 1 CLx RTN ----------------------------------------------------------------------------------------- LBL B   // For Add or Subtract Fractions RCL 2 RCL 4 X≤Y X<>Y X<>Y STO 0 X<>Y ENTER *LBL 1 ENTER ENTER RCL 0 ÷ FRAC X=0 GTO 2 Rv + GTO 1 *LBL 2 + STO 5 RCL 2 ÷ RCL 1 x RCL 5 RCL 4 ÷ RCL 3 x + STO 6 RCL 5 *LBL 3 - LSTx X<>Y ABS X≠Y GTO 3 STO 7 1 X<>Y X>Y   GTO 4 RCL 5 RCL 6 RTN *LBL 4 RCL 5 RCL 7 ÷ RCL 6 RCL 7 ÷ RTN  <--You can stop here and continue to LBL E if need only + and - Fraction ----------------------------------------------------------------------------------------- LBL C  // For Multiply Fractions RCL 1 RCL 3 x STO 5 RCL 2 RCL 4 x STO 6 RCL 5 GTO 5 ----------------------------------------------------------------------------------------- LBL D  // For Divide Fractions RCL 1 RCL 4 x STO 5 RCL 2 RCL 3 x STO 6 RCL 5 GTO 5 ----------------------------------------------------------------------------------------- LBL 5 - LSTx X<>Y ABS X≠Y GTO 5 STO 7 1 X<>Y X>Y GTO 6 RCL 6 RCL 5 RTN *LBL 6 RCL 6 RCL 7 ÷ RCL 5 RCL 7 ÷ RTN ----------------------------------------------------------------------------------------- LBL E   // For Mixed Fraction STO 8 X<>Y X<>Y ÷ LSTx X<>Y ENTER FRAC X<>Y INT Rv x EEX 4 ÷ R^ + FIX 4 RCL 8 X<>Y RTN ----------------------------------------------------------------------------------------- See also on my YouTube channel here https://youtu.be/yJOskANA4gM Gamo RE: (11C) Arithmetic with Fractions - Dieter - 09-16-2018 04:58 PM (09-15-2018 07:02 AM)Gamo Wrote:  Program to add, subtract, multiply, divide, simplify to lowest term and convert to mixed fraction. ... See also on my YouTube channel here https://youtu.be/yJOskANA4gM I watched the video. It's a really nice one, but does the calculation really take that long? I assume this is due to an ineffective GCD routine. Then I recalled the days in the early 1980s when I got my new HP-41C. And a fraction program was one of the first things I wrote for it. These memories made me think about writing such a program once again. It has 100 lines and should run reasonably fast. The program can be this short as a/b : c/d is the same as a/b · d/c, so the multiplication and division routine are essentially the same, with an X⇄Y command being the only difference. Your program can also take advantage of this: you may remove the complete division routine. If the user can press [CHS] [B] for subtraction he may also press [X⇄Y] [C] for division. ;-) So, for the mentioned sentimental reasons I tried a fraction program once again. I hope you don't mind me posting it here in this thread. I think it should run on the 11C, 15C, 67 and 97, maybe also on other HPs (e.g. the 34C). The code uses the syntax of the Panamatik HP67 emulator. Here X!=0? is the X≠0? test (that's TEST 0 on the 15C). Add a FIX 0 (or FIX DSP 0) after LBL 0 and LBL E if you prefer. Code: LBL B CHS LBL A STO 2 Rup * Rdown X<>Y STO*2 * Rup + RCL 2 GTO 0 LBL C X<>Y LBL D Rdown * Rdown * Rup LBL 0 STO 2 ABS STO 4 X<>Y STO 1 ABS STO 3 LBL 1 RCL 3 RCL 3 RCL 4 / INT RCL 4 STO 3 * - STO 4 X!=0? GTO 1 RCL 3 STO/1 STO/2 RCL 1 RCL 2 * ENTER ABS X!=0? / RCL 1 ABS * STO 1 PAUSE RCL 2 ABS STO 2 R/S LBL E STO 2 ABS STO 4 X<>Y STO 1 ABS STO 3 RCL 1 RCL 2 * STO 0 ABS X!=0? STO/0 RCL 3 RCL 3 RCL 4 / INT RCL 0 * PAUSE ABS RCL 4 * - RCL 0 * PAUSE RCL 3 RCL 0 * STO 1 RCL 4 STO 2 R/S GTO E Usage: Calculate a/b [+ – x ÷] c/d a [ENTER] b   [ENTER]   c ENTER d [A] => add [B] => subtract [C] => multiply [D] => divide [E] => convert to mixed fraction The result of each operation is in Y (numerator) and X (denominator). Even after a mixed fraction has been displayed the simple fraction still is in Y and X. So chain calculations are possible. 111 [ENTER] 33  [ENTER]  7 [ENTER] 17 [A] => "706" 187 [E] => "3" "145" 187 Now subtract 1/187 1 [ENTER] 187 [B] => "705" 187 [R/S] => "3" "144" 187 Note: after a calculation you can simply press [R/S] instead of [E] to view the result as a mixed fraction. Another [R/S] repeats the output. Multiplication example: 1001 [ENTER] 98  [ENTER]  123 [ENTER] 321 [C] => "5863" 1498 [E] => "3" "1369" 1498 Note: the program also displays negative fractions correctly. With the last result still on the stack, multiply by (–2): –2 [ENTER] 1 [C] => "–5863" 749 [E] => "–7" "–620" 749 The [E] key can be used independently for displaying mixed fractions. Example: 355 [ENTER] 113 [E] => "3" "16" 113. Note: the result of a calculation is always stored in R1 (numerator) and R2 (denominator), i.e. it can also be retrieved from there. So you can do some other calculations and finally return to the last fraction result with a simple RCL 1 RCL 2. Finally: thank you, Gamo, for reminding me of this topic. Writing a fraction program after 35 years was a lot of fun. :-) Dieter RE: (11C) Arithmetic with Fractions - Thomas Klemm - 09-16-2018 09:17 PM You may want to try the example given in RATIONAL ARITHMETIC IN FLOATING-POINT by W. Kahan for the HP-67/97: $$\frac{123,456,799}{123,456}-\frac{988,297,396}{988,291}=\frac{31}{189751872}$$ Cheers Thomas RE: (11C) Arithmetic with Fractions - Dieter - 09-16-2018 10:06 PM (09-16-2018 09:17 PM)Thomas Klemm Wrote:  You may want to try the example given in RATIONAL ARITHMETIC IN FLOATING-POINT by W. Kahan for the HP-67/97: $$\frac{123,456,799}{123,456}-\frac{988,297,396}{988,291}=\frac{31}{189751872}$$ I'm afraid the very basic methods implemented in this program will not be able to handle this. The program first calculates the product of the two denominators which in this case has 12 significant digits and thus more than the 11/15/67/97 can handle. A better algorithm would first determine the LCM of the denominators. Dieter RE: (11C) Arithmetic with Fractions - Thomas Klemm - 09-16-2018 11:41 PM (09-16-2018 10:06 PM)Dieter Wrote:  A better algorithm would first determine the LCM of the denominators. But even then the nominator numerator would be 100 instead of 31 due to rounding to 10 significant digits: \begin{align*} \frac{123,456,799}{123,456}-\frac{988,297,396}{988,291} &= \frac{123,456,799\times1,537}{123,456\times1,537}-\frac{988,297,396\times192}{988,291\times192} \\ &= \frac{189,753,100,063}{189,751,872}-\frac{189,753,100,032}{189,751,872} \\ &= \frac{189,753,100,063-189,753,100,032}{189,751,872} \\ &= \frac{31}{189751872} \end{align*} W. Kahan explains in the linked paper how to avoid this. Kind regards Thomas RE: (11C) Arithmetic with Fractions - Albert Chan - 09-17-2018 01:12 AM Hi, Thomas Klemm, Thanks for the link to Kahan paper. I tried it, it work perfectly. However, Kahan's example does not shown the algorithm's power. Doing the math as fixed fraction already avoid the overflow problem ... 123456799/123456 - 988297396/988291 = (1000 + 799/123456) - (1000 + 6396/988291) = 799/(643*192) - 6396/(643*1537) = (799 * 1537 - 6396 * 192) / (643*192*1537) = (1228063 - 1228032) / 189751872 = 31 / 189751872 RE: (11C) Arithmetic with Fractions - Steve Simpkin - 09-17-2018 01:46 AM (09-16-2018 10:06 PM)Dieter Wrote:  A better algorithm would first determine the LCM of the denominators. Dieter A HP-11C program to determine the LCM of the numbers in X and Y. Code: LBL A STO 0 x<>y STO 1 LBL 0 x=y RTN x>y GTO 1 RCL 1 + GTO 0 LBL 1 x<>y RCL 0 + x<>y GTO 0 From Thomas Klemm, post #8 http://www.hpmuseum.org/forum/thread-11144.html RE: (11C) Arithmetic with Fractions - Gamo - 09-17-2018 03:47 AM Thanks Dieter for the review and your program is shorter with faster computation. Grad that this bring back your memory this memory also good to share your memory with great program. Thanks again. Thomas Klemm I try your large Fractions Subtraction on HP Prime result is 1 / 6.250.000 12C Android Emulator result is 25 / 47.437.968 (same program as 11C) Wolfram Alpha gave correct result same as stated in RATIONAL ARITHMETIC IN FLOATING-POINT by W. Kahan Remark: Even HP Prime can't do it. Gamo RE: (11C) Arithmetic with Fractions - Carsen - 09-17-2018 08:14 AM Hello Gamo: I can see you put a lot of hard work into your HP-11C program. Looking good. (09-17-2018 03:47 AM)Gamo Wrote:  Thomas Klemm I try your large Fractions Subtraction on HP Prime result is 1 / 6.250.000 When I do the large Fractions Subtraction on my HP Prime, I get the intended result. See the screenshot below. RE: (11C) Arithmetic with Fractions - Gamo - 09-17-2018 09:40 AM Thank You Carsen My bad I did this calculation on HOME mode and got that result. When change to CAS mode got the correct answer. Gam0 RE: (11C) Arithmetic with Fractions - Albert Chan - 09-17-2018 04:04 PM (09-17-2018 01:12 AM)Albert Chan Wrote:  Hi, Thomas Klemm, Thanks for the link to Kahan paper. I tried it, it work perfectly. However, Kahan's example does not shown the algorithm's power. Doing the math as fixed fraction already avoid the overflow problem ... I made up a better example, to show Kahan's algorithm, where mixed fraction trick won't work: M/N = 1234567/12345648 - 635720/6357263 From Kahan's paper: (using HP-12C, with my Mod/Gcd program) G = gcd(12345648, 6357263) = 181 b = 12345648 / 181 = 68208 d = 6357263 / 181 = 35123 a = 1234567 % 181 = 147 c = 635720 % 181 = 48 ad - bc = 147*35123 - 68208*48 = 1889097 = 181 * 10437 g =gcd(G, ad - bc) = 181 M = 10437 + Det({{6820, 68208}, {3512, 35123}}) = 10437 - 7636 = 2,801 N = G/g * b * d = 68208 * 35123 = 2,395,669,584 RE: (11C) Arithmetic with Fractions - Albert Chan - 09-17-2018 06:44 PM Just want to clarify, Kahan's algorithm basically mechanized below steps: G = gcd(12345648, 6357263) = 181 M/N = 1234567/12345648 - 635720/6357263 = (6820 G + 147) / (68208 G) - (3512 G + 48) / (35123 G) = (35123 G *(6820 G + 147) - 68208 G *(3512 G + 48)) / (68208 * 35123 * G^2) = ((6820*35123 - 3512*68208) G + (147*35123 - 68208*48)) / (68208 * 35123 * G) = (-7636 G + 1889097) / (68208 * 35123 * G) = (-7636 G + 10437 G) / (68208 * 35123 * G) = 2,801 / 2,395,669,584 RE: (11C) Arithmetic with Fractions - Dieter - 09-18-2018 06:51 PM (09-16-2018 11:41 PM)Thomas Klemm Wrote:  But even then the nominator would be 100 ... I just noticed this – because I make the same mistake all the time. ;-) Actually I proofread all my fraction-related posts to check if I did it again and wrote "nominator" instead of "numerator". And I wonder if this is because both of usually speak German. Or does this also happen to others with a different background? Dieter RE: (11C) Arithmetic with Fractions - Thomas Klemm - 09-18-2018 07:19 PM Thank's for notifying me about that. It's fixed now in my post and I hope it doesn't happen anymore. (09-18-2018 06:51 PM)Dieter Wrote:  And I wonder if this is because both of usually speak German. Or does this also happen to others with a different background? That's an interesting question. Though in German there is a related word Nominierung for English nomination the German word Zähler for English numerator is not related at all. Not sure if we could still consider it a false friend. Kind regards Thomas RE: (11C) Arithmetic with Fractions - Thomas Klemm - 09-18-2018 07:29 PM (09-18-2018 06:51 PM)Dieter Wrote:  because I make the same mistake all the time. ;-) At least I know now where I copied it from: HP17bII+ Programming t-distribution RE: (11C) Arithmetic with Fractions - Valentin Albillo - 09-18-2018 09:25 PM . Hi, Dieter: (09-18-2018 06:51 PM)Dieter Wrote:  And I wonder if this is because both of usually speak German. Or does this also happen to others with a different background? In Spanish it would be "numerador" and "denominador", never seen anyone using "nominador" instead of "numerador" either verbally or in print. V. . RE: (11C) Arithmetic with Fractions - Dieter - 09-18-2018 10:38 PM (09-18-2018 09:25 PM)Valentin Albillo Wrote:  In Spanish it would be "numerador" and "denominador", never seen anyone using "nominador" instead of "numerador" either verbally or in print. The English word "numerator" and the Spanish "numerador" are both derived from the Latin verb "numerare" = "to count". So a "numerator" is someone or something that "counts". A "counter", if you like. And that's exactly what the German word means: "Zähler" simply is a direct translation of the Latin "numerator". Which makes the use of a word like "nominator" look even more strange. #-) Dieter RE: (11C) Arithmetic with Fractions - Massimo Gnerucci - 09-19-2018 07:45 AM (09-18-2018 10:38 PM)Dieter Wrote:   (09-18-2018 09:25 PM)Valentin Albillo Wrote:  In Spanish it would be "numerador" and "denominador", never seen anyone using "nominador" instead of "numerador" either verbally or in print. The English word "numerator" and the Spanish "numerador" are both derived from the Latin verb "numerare" = "to count". So a "numerator" is someone or something that "counts". A "counter", if you like. And that's exactly what the German word means: "Zähler" simply is a direct translation of the Latin "numerator". Which makes the use of a word like "nominator" look even more strange. #-) Dieter And, of course, we are close to the latin root: numeratore and denominatore. RE: (11C) Arithmetic with Fractions - Gamo - 09-22-2018 06:33 AM Thomas Klemm I try your large Fractions Subtraction again. But this time on the HP-12C Platinum This is the only one of the Modern Voyager Series that be able to do it correctly. Because of the internal precision of 15 digits. Update: I try to squeeze program all into the Classic 12C but can't do it because of the limited memory since my "Arithmetic with Fraction" used up 8 register and took 98 program lines when run the "Error 6" shown. With the HP-12C Platinum I don't have to worry about memory capacity and successfully make it and not even use half the program lines limit of 400 lines. As Dieter recommended to change the algorithm for the GCD part of the program to speed up the computation process and I did updated to this program for HP-12C Platinum it run very fast. Later I'll post the update version both for HP 12C Platinum and HP-15C instead of the 11C as a new post. For a mean time here is the clip for large Fractions On HP-12C Platinum https://youtu.be/G0m1EFGgihk Thank You Gamo RE: (11C) Arithmetic with Fractions - Dieter - 09-24-2018 12:59 PM (09-22-2018 06:33 AM)Gamo Wrote:  I try to squeeze program all into the Classic 12C but can't do it because of the limited memory since my "Arithmetic with Fraction" used up 8 register and took 98 program lines when run the "Error 6" shown. I just posted a few suggestions for the 15C version which will reduce the number of steps significantly. The program only needs R1...R6, so R7 and R8 are not required. You can also free up R5 and R6 by storing the result not there but, say, in R3 and R4 which are no longer required once the result has been calculated. I am sure you can squeeze the whole program into a regular "classic" 12C. ;-) Dieter