diff --git a/doc/emacs-notes.org b/doc/emacs-notes.org index a4a4d93..39fd427 100644 --- a/doc/emacs-notes.org +++ b/doc/emacs-notes.org @@ -8,6 +8,8 @@ By Andrew Hyatt, found here: https://github.com/ahyatt/emacs-calc-tutorials. License is GPLv3. +Order as given by https://blog.markhepburn.com/2013/12/07/andrew-hyatts-emacs-calc-tutorials + ** README #+BEGIN_EXAMPLE @@ -22,6 +24,473 @@ anything, the normal Github bug / request / or pull request process will work. #+END_EXAMPLE +** HEX + +OK, seems like there's interest in some quick calc tips. Here's today's: + +How to convert decimal to hexidecimal. Let's say you want to convert number +12345 to hex. + +#+BEGIN_EXAMPLE +M-x calc +d 6 (sets the number radix to 16, meaning all output will be in hex) +10#12345 (inputs the number 12345 in base 10) + +The output reads: +1: 16#3039 +#+END_EXAMPLE + +The answer is therefore =0x3039=. + +And then you can do a =d 0= to set the number radix back to normal, base 10. + +Here's how to do the other way. Let's convert =0xABCDEF= to base 10. + +#+BEGIN_EXAMPLE +M-x calc +16#ABCDEF + +The output reads: +1: 11259375 +#+END_EXAMPLE + +** Date + +Ever want to know how many seconds old David Hasselhoff is? calc can do many +things, but it doesn't know much about Hasselhoff, so first I do a query on +Google for [david hasselhoff]. I get a knowledge card on the right saying he was +born July 17, 1952. It doesn't give a time, so we'll just assume it was at +midnight. + +#+BEGIN_EXAMPLE +M-x calc +t N (put the current time on the stack) +' (press ' to enter algebraic mode, then you input the date). +- (subtract the two to get the number of days David has been alive) +24 (we're going to multiply by 24, the number of hours in a day) +60 (the number of minutes in an hour) +60 (the number of seconds in a minute) +* +* +* + +Final result: +1: 1910255938.01 +#+END_EXAMPLE + +There you have it, he's... wait, how many seconds? That's really hard to read. + +Back into calc! + +#+BEGIN_EXAMPLE +d g (toggle digit grouping) + +The final final result: +1: 1,910,255,938.01 +#+END_EXAMPLE + +Ah, that's a 1.9 billion seconds. Sweet! + +** Time + +Hey, what's the time? It's time to get ill! No, actually I meant the time in +seconds since the epoch. Yesterday I went over doing math with time, which is +fun but not something I use everyday. Much more useful is converting to and from +Unix timestamps. + +Let's start by getting the time now in seconds since the epoch: + +#+BEGIN_EXAMPLE +M-x calc +t N (get the time now) +t U (convert the time to seconds since the epoch) + +Result: +1: 1359424746 +#+END_EXAMPLE + +Oh, and you want to insert that into your last used buffer? + +#+BEGIN_EXAMPLE +y (that doesn't mean "yes", that means yank into the last buffer) +#+END_EXAMPLE + +Done! Just to be complete, let's convert another date we have to input: + +#+BEGIN_EXAMPLE +'<12:00pm Jul 4, 1776> (single quote to enter algebraic mode, then the date) +t U (converts the time to seconds since the epoch) +#+END_EXAMPLE + +But wait, what will happen? This is considerably before the epoch. + +#+BEGIN_EXAMPLE +Result: +1: -6106003200 +#+END_EXAMPLE + +Oh calc, you never let me down. + +Let's do the other way. Remember the Billenium? + +#+BEGIN_EXAMPLE +1e9 +t U (converts the time in seconds since the epoch to text) + +Result: +1: <9:46:40pm Sat Sep 8, 2001> +#+END_EXAMPLE + +Wow, I never realized how close the Billenium was to September 11th. Kind of spooky... + +** Random + +I use calc whenever I need a random number. The interface is easy and the random +numbers are (supposedly) high quality. + +So, let's start with something simple: A random number between 0 and 100: + +#+BEGIN_EXAMPLE +M-x calc +100 (the upper bound, all values will be between 0 and this) +k r (creates a random number between 0 and the number on the stack) + +Result: +1: 66 (of course, yours will be different) +#+END_EXAMPLE + +I want another one! +#+BEGIN_EXAMPLE +k a (creates another number with the same upper bound as the last) +#+END_EXAMPLE + +Now that I’ve had a taste of that sweet sweet randomness, I want a vector of 50! + +#+BEGIN_EXAMPLE +100 (the upper bound, again) +50 (the number to generate) +k h (generate a vector of 50 random numbers between 0 and 100) + +1: [60, 72, 61, 74, 77, 97, 10, 90, 8, 29, 82, 81, 51, 58, 7, 88, 99, 1, 37, 89, 93, 84, 52, 94, 2, 35, 5, 48, 87, 47, 14, 6, 79, 18, 67, 76, 70, 9, 43, 65, 69, 23, 55, 11, 53, 78, 50, 30, 13, 42] +#+END_EXAMPLE + +OK, that's nice. But how about a number between 0 and 1? + +#+BEGIN_EXAMPLE +1.0 +k r + +Result: +1: 0.636988102539 +#+END_EXAMPLE + +OK, how about number between -50 and 50? For that we need to use what calc calls +an interval form: + +#+BEGIN_EXAMPLE +[ (Starts interval form) +50 (You can't just type -50 in calc) +n (negate, givint -50) +.. (the middle part of the interval form) +50] (closing the interval form) +#+END_EXAMPLE + +What you see now in calc is: +#+BEGIN_EXAMPLE +[-50 .. 50] +#+END_EXAMPLE +And you could have just typed it in with: +#+BEGIN_EXAMPLE +'[-50 .. 50] +#+END_EXAMPLE +which would be a lot easier, really. + +#+BEGIN_EXAMPLE +k r +#+END_EXAMPLE +This produces a random number from the bounds of the interval, in this case both +-50 and 50 are possible, if you wanted them to be exlusive bounds, you'd use the +form =(-50 .. 50)=. + +Finally, you can re-arrange a list: +#+BEGIN_EXAMPLE +'[1 2 3 4] (our starting vector) +-1 (signals to use the vector above, could also be the size of the vector) +k h + +Result: +1: [3, 1, 4, 2] +#+END_EXAMPLE + +But =k a= will not give you more variants, unfortunately. + +** Unit Conversion + +You load 16 tons, and what do you get? I mean, in kilograms. + +#+BEGIN_EXAMPLE +M-x calc +' 16 tons (' to enter algebraic mode, so you can type out the units) +u c kg (u c for "unit convert", and kg being the target unit). + +Result: +1: 14514.95584 kg +#+END_EXAMPLE + +Calc treats units as special. If you added something, such as: + +#+BEGIN_EXAMPLE +3 ++ + +Result: +1: 14514.95584 kg + 3 +#+END_EXAMPLE + +But you can remove the units from the above using: +#+BEGIN_EXAMPLE +u r (remove units) + +Result: +1: 14517.95584 +#+END_EXAMPLE + +OK, that's all well and good. But I've always wondered how much is Grandpa +Simpson's gas mileage when he said "My car gets 40 rods to the hogshead and +that's the way I likes it." + +For that, we need to define the units. Calc knows about a lot of units, but +maybe not the rod and hogshead. In fact, in the calc info pages, defining what a +"rod" is the example for how to define your own units. Let's get started! + +#+BEGIN_EXAMPLE +'16 ft (The equivalent to one rod) +u d rod Rod (defines a new unit rod, with optional description "Rod") +#+END_EXAMPLE +Now a hogshead is a unit of measurement that varies by what liquid it contains. +I don't know what the unit is for gasoline, but let's use sherry as a +substitute, in which a hogshead is 245 liters. + +#+BEGIN_EXAMPLE +'245 liters +u d hogshead (don't bother with a description this time) +'40 rod +'1 hogshead +/ +#+END_EXAMPLE +Wait, what units should we be using? +#+BEGIN_EXAMPLE +u v (show the units table, a handy table of all units) +u c mi/gal (the units come from the unit table) + +Result: +1: 1.87280731429e-3 mi / gal +#+END_EXAMPLE + +But wait, we can do better. Why upgrade this measure to something that isn't +even standard? Miles per gallon is just a bit better than rods per hogshead (in +fact, that was what the original joke was about). + +#+BEGIN_EXAMPLE +u c si (convert everything to scientific units) + +Result: +1: 796.212244896 / m^2 +#+END_EXAMPLE + +Not that I understand this number, but at least in miles per gallon, I can see +that that's not such great fuel economy, but what you do expect from Grandpa? + +OK, one more cool thing, then I'm out of here. Calc can split up numbers into +multiple units. Here's 42 inches in feet and inches: + +#+BEGIN_EXAMPLE +'42 in +u c ft+in (Convert to a mixture of feet and inches) + +Result: +1: 3 ft + 6. in +#+END_EXAMPLE + +Calc, you're sooo coool! + +** Pi and Precision + +This one's about p and P and mostly about pi. + +First, let's pi it up: + +#+BEGIN_EXAMPLE +M-x calc +P (this gives you pi) + +Result: +1: 3.14159265359 +#+END_EXAMPLE + +Well, I guess that's a reasonable pi. But, c'mon, this is calc. Can't we get a +bit more digits? How about 100? + +#+BEGIN_EXAMPLE +p 100 (sets precisions to 100) +P (need to ask calc again for pi, it doesn't recalculate) + +Result: +1: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 +#+END_EXAMPLE + +Well, but actually evaluating it robs it of its never-ending charm. Let's just +use it as a variable. How about calculating the area of a circle with a 5 km +radius? + +#+BEGIN_EXAMPLE +'5000 m +2 +^ +'pi (enter pi as a variable) +* + +We get: +1: 25000000 m^2 pi +#+END_EXAMPLE + +Yeah, sure that’s what I said I wanted, but I’ve changed my mind - now I want a number. + +#+BEGIN_EXAMPLE += + +1: 78539816.3397448309615660845819875721049292349843776455243736148076954101571552249657008706335529267 m^2 +#+END_EXAMPLE + +Whoops, looked like I forgot to set the precision back to normal. And I can't +read this. Let's make it a bit nicer. + +#+BEGIN_EXAMPLE +Control-_ (normal emacs undo) +p 7 +d g (turn digit grouping on) += + +Result: +1: 7.853983e7 m^2 +#+END_EXAMPLE + +Oh, that's because I didn't have enough precision to render it without resorting +to scientific notation. Let's just bump the precision up again. + +#+BEGIN_EXAMPLE +Control-_ (undo, since we have to redo the pi conversion with more precision) +p 10 += + +Result: +1: 78,539,816.35 m^2 +#+END_EXAMPLE + +Ah, that's better. + +** Strings + +Did you know you could work with strings in calc? For an example, let's find out +what "Hello world" is in binary: + +#+BEGIN_EXAMPLE +M-x calc +d 2 (change the to binary mode) +"Hello world (Enter the string "Hello world" which turns into a vector of numbers) + +Result: +1: [2#1001000, 2#1100101, 2#1101100, 2#1101100, 2#1101111, 2#100000, 2#1110111, 2#1101111, 2#1110010, 2#1101100, 2#1100100] +#+END_EXAMPLE + +And similarly, we can convert back. If someone gave you the binary number: +=01001000011011110110110001100001= and asked what the string was, I'd have no +idea... but calc knows: + +#+BEGIN_EXAMPLE +d " (changes to string mode) +C-x b scratch (whaaa, leave calc?) +01001000011011110110110001100001 (enter the number we're parsing) +C-a (go to the start of the line) +C-x ( (start a macro) +2# (prefix the number with a binary indicator) +C-u 8 C-f (Jump forward 8 characters) + (insert a space to separate the numbers) +C-x ) (end the macro) +C-x e (repeat the macro) +e e (repeat twice twice more) +C- (set mark) +C-a (goto beginning of line) +C-x g (copy region into calc) + +Result: + +1: "Hola" +#+END_EXAMPLE + +And there you have it! Maybe there is an easier way to convert from the giant +binary number to a vector of bytes, but I don't know it yet. + +** Fractional Arithmetic + +This one is pretty short, but it's about one of my favorite features of calc: +the ability to handle fractions as fractions instead of rendering them as real +numbers. + +Quick, what's =5/8 + 9/21=? + +Um, ok... better start multiplying things... wait, let's just tell calc to do +it. + +#+BEGIN_EXAMPLE +M-x calc +5:8 (this is how you enter a fraction) +9:21 ++ + +Result: +1: 59/56 +#+END_EXAMPLE + +So easy! If we want to convert it to a float you can do this: + +#+BEGIN_EXAMPLE +c f (convert to +float) + +Result: + +1: 1.05357142857*10.^0 +#+END_EXAMPLE + +And if you want it back as a fraction, then just do: + +#+BEGIN_EXAMPLE +c F (convert to fraction) + +Result: + +1: 59/56 +#+END_EXAMPLE + +That's so awesome! + +You could also enter fractions this way: + +#+BEGIN_EXAMPLE +m f (set fraction mode, integer division will result in fractions) +5 +8 +/ + +Result: + +1: 5/8 +#+END_EXAMPLE + +Now you can live in the nice world of fractions as much as you like. It's a nice +world, full of pleasant to look at integers taking up little horizontal space + ** Algebra I think it's time to write about one of the amazing things that calc can do: @@ -120,6 +589,220 @@ Result: I could keep going, but trust me, there's more. And you can even define your own languages by constructing syntax tables, but I won't get into that now. +** More on Algebra + +Jim is 42 years old. He has one brother, and their total age is 100. What is the +brother's age? OK, this isn't a very hard problem, but let's just introduce calc +algebra by solving it. + +#+BEGIN_EXAMPLE +M-x calc +'42 + x = 100 (' to enter algebraic input) +a S x (solve for x) + +Result: +1: x = 58 +#+END_EXAMPLE + +Let's make this harder. Jim and Dan's ages sum to 100. Jim is 5 years older than +Dan. How old are they? + +#+BEGIN_EXAMPLE +'[j + d = 100, d + 5 = j] +a S j,d + +Result: +1: [j = 52.5, d = 47.5] +#+END_EXAMPLE + +Nice! + +And of course it can give you more than just numerical solutions: + +#+BEGIN_EXAMPLE +'sin(x) + tan(y) = pi / 2 +a S y (solve for y) + +Result: +1: y = arctan(pi / 2 - sin(x)) +#+END_EXAMPLE + +Sometimes there are more than one solution. For example: +#+BEGIN_EXAMPLE +'x^2 = 25 +a S x + +Result: +1: x = 5 +#+END_EXAMPLE + +Wait, what happened to -5! That's a valid solution, why didn't calc tell us +about it? What's happening here is that calc is telling us about the first valid +thing it can find, which is basically how it operates. But you can always get +everything: + +#+BEGIN_EXAMPLE +'x^2 = 25 +a P x (find the polynomial solutions) + +Result: +1: [5, -5] +#+END_EXAMPLE + +Sometimes there aren't a finite number of results because you aren't dealing +with polynomials. You can just get a generalized solution: + +#+BEGIN_EXAMPLE +'sin(x)^2 = 25 +H a S x (solve for x, giving the generalized solution) + +Result: +1: x = arcsin(5 s1) (-1)^n1 + 180 n1 +#+END_EXAMPLE + +This uses the calc notation =n1=, which you just means any integer. You can also +see another notation =s1= which means any sign. In this case =5 s1= means that that +number can be 5 or -5. + +Looking at how awesome calc is, it's just a shame I never knew about it in high +school... + +** Financial + +I recently chatted with emacspeak creator T.V. Raman, and told him I was +writing a series of short tutorials about calc. He is really a calc fanatic, and +told me a story in which he astounded a loan officer by calculating scheduled +loan payments with just a few keystrokes in calc. Raman is living proof that +calc is a useful tool for so many situations, and it always pays to have emacs +running. He also mentioned that he found the explanation in the calc tutorial +about the financial functions to be the clearest he's ever read. + +So, yes, calc can do finance. Let's say that you were sitting in front of a loan +officer, and she told you that for your loan of $500,000, you need to pay in 30 +installments with a 5% interest rate. How much do you need to pay each month? +Wait a second! Stop right there, loan officer! I have calc! + +#+BEGIN_EXAMPLE +M-x calc +500000 (the amount of the loan) +30 (the number of payments) +'5% (equivalent to typing 0.05) +b M (calc-fin-pmt, computing the amount of periodic payments to amortize a loan) + +Result: +1: 25,000 +#+END_EXAMPLE + +OK, but that's a bit obvious, since $25,000 is just 5% of $500,000. If the +number of payments was much smaller, we'd get a larger value. Let's take another +question: if you wanted to only pay $10,000 in each installment? How many +installments would it take to pay off the loan? + +#+BEGIN_EXAMPLE +'5% +10000 (the payment we want to make) +500000 (the loan amount) +b # (calc-fin-nper, calculate the number of installments needed) + +Result +1: nper(0.05, 10,000, 500,000) +#+END_EXAMPLE + +What? Oh, I see, I also go the message: "Payment too small to cover interest +rate: 10000". Oh, right, 5% of $500,000 is already $25,000, so we'd never pay it +off at that rate. What if we payed $50,000 instead? + +#+BEGIN_EXAMPLE +'5% +50000 (the payment we want to make) +500000 (the loan amount) +b # + +Result: +1: 14.2066908 +#+END_EXAMPLE + +So, it would take just over 14 payments to pay off the loan. + +OK, one more cool one: Let's say you meet an investment banker who gives you the +following deal. I've got a investment for you, she says. Just give me $100,000 +and I'll give you $10,000 at the end of each year for the next 12 years. +Assuming the interest rate will stay at 3% for the next 12 years. Is it a good +deal? + +Hey, what are you asking me for? I have no idea! Calc knows, though, because it +can tell you the break-even point for the cost of an investment that gives +periodic payments. + +#+BEGIN_EXAMPLE +'3% (the interest rate) +12 (the number of payments) +10000 (the payment you get each time) +b P (calc-fin-pv, calculate the "present value" of the investment, the break-even point for the investment) + +Result: +1: 99,540.0399357 +#+END_EXAMPLE + +In other words, the break-even point for the initial cost is $99,540. If the +investment costs more than this, it's no good at that assumed interest rate. +Better reject the deal. Trust calc more than any investment banker. + +This is just a small sampling of some of the financial calculations that calc +can perform. The next time you are making an investment, fire up calc. You'll +not only have confidence in the deal, you may just amaze someone with the power +of emacs, just like T.V. Raman did. + +** Calculus + +Quick, integrate =2x + sin(y)=! Well, frankly, it's been so long since I've done +calculus by hand I can't remember anymore. Well, knowing calculus is good, but +knowing calc is even more useful! + +#+BEGIN_EXAMPLE +M-x calc +'2x + sin(y) (The single quote enters algebraic mode) +a i y (Calculate the integral with respect to y) + +Result +1: 2 x y - 180 cos(y) / pi +#+END_EXAMPLE + +You can also integrate over specific regions by using C-u a i, whereupon it will +prompt you for the start and end point of the integration. + +As the manual mentions, the results are often not as simplified as they could +be. Calc is impressive, but it isn't as sophisticated as Mathematica. + +An example of some issues are if we just take the derivative of the integral we +just calculated. We should get back to our original formula. + +#+BEGIN_EXAMPLE +a d y (Calculate the derivative with respect to y) + +Result: +1: 2 x + 3.14159265358 sin(y) / pi +#+END_EXAMPLE + +Clearly this should be 2x + sin(y), but calc may have made an error. + +OK, let's make calc do something cool so we can forget this unfortunate +incident. Hey, how about making a Taylor series of a function? + +#+BEGIN_EXAMPLE +'2x + sin(y) (re-enter the formula) +a t y 6 (Calculate the Taylor series of a term, over y, for 6 terms) + +Result: +1: 2 x + y - y^3 / 6 + y^5 / 120 - y^7 / 5040 + y^9 / 362880 +#+END_EXAMPLE + +This isn't a bad approximation, see [[https://www.google.com/search?q=y+-+y%5E3+%2F+6+%2B+y%5E5+%2F+120+-+y%5E7+%2F+5040+%2B+y%5E9+%2F+362880][Google’s answer]] for comparison. + +So, yes, calc can do college-level math, even if the answers aren't perfectly +simplified. It's not Mathematica, but it is free and integrated into emacs, so +it's definitely nice to have. + ** Bit Manipulation Quick! What bits are set on the number 925817? What, are you going to convert it @@ -258,687 +941,6 @@ Result: Hope this helps you twiddle those bits in all the ways that make you happy. -** Calculus - -Quick, integrate =2x + sin(y)=! Well, frankly, it's been so long since I've done -calculus by hand I can't remember anymore. Well, knowing calculus is good, but -knowing calc is even more useful! - -#+BEGIN_EXAMPLE -M-x calc -'2x + sin(y) (The single quote enters algebraic mode) -a i y (Calculate the integral with respect to y) - -Result -1: 2 x y - 180 cos(y) / pi -#+END_EXAMPLE - -You can also integrate over specific regions by using C-u a i, whereupon it will -prompt you for the start and end point of the integration. - -As the manual mentions, the results are often not as simplified as they could -be. Calc is impressive, but it isn't as sophisticated as Mathematica. - -An example of some issues are if we just take the derivative of the integral we -just calculated. We should get back to our original formula. - -#+BEGIN_EXAMPLE -a d y (Calculate the derivative with respect to y) - -Result: -1: 2 x + 3.14159265358 sin(y) / pi -#+END_EXAMPLE - -Clearly this should be 2x + sin(y), but calc may have made an error. - -OK, let's make calc do something cool so we can forget this unfortunate -incident. Hey, how about making a Taylor series of a function? - -#+BEGIN_EXAMPLE -'2x + sin(y) (re-enter the formula) -a t y 6 (Calculate the Taylor series of a term, over y, for 6 terms) - -Result: -1: 2 x + y - y^3 / 6 + y^5 / 120 - y^7 / 5040 + y^9 / 362880 -#+END_EXAMPLE - -This isn't a bad approximation, see [[https://www.google.com/search?q=y+-+y%5E3+%2F+6+%2B+y%5E5+%2F+120+-+y%5E7+%2F+5040+%2B+y%5E9+%2F+362880][Google’s answer]] for comparison. - -So, yes, calc can do college-level math, even if the answers aren't perfectly -simplified. It's not Mathematica, but it is free and integrated into emacs, so -it's definitely nice to have. - -** Date - -Ever want to know how many seconds old David Hasselhoff is? calc can do many -things, but it doesn't know much about Hasselhoff, so first I do a query on -Google for [david hasselhoff]. I get a knowledge card on the right saying he was -born July 17, 1952. It doesn't give a time, so we'll just assume it was at -midnight. - -#+BEGIN_EXAMPLE -M-x calc -t N (put the current time on the stack) -' (press ' to enter algebraic mode, then you input the date). -- (subtract the two to get the number of days David has been alive) -24 (we're going to multiply by 24, the number of hours in a day) -60 (the number of minutes in an hour) -60 (the number of seconds in a minute) -* -* -* - -Final result: -1: 1910255938.01 -#+END_EXAMPLE - -There you have it, he's... wait, how many seconds? That's really hard to read. - -Back into calc! - -#+BEGIN_EXAMPLE -d g (toggle digit grouping) - -The final final result: -1: 1,910,255,938.01 -#+END_EXAMPLE - -Ah, that's a 1.9 billion seconds. Sweet! - -** Financial.org - -I recently chatted with emacspeak creator T.V. Raman, and told him I was -writing a series of short tutorials about calc. He is really a calc fanatic, and -told me a story in which he astounded a loan officer by calculating scheduled -loan payments with just a few keystrokes in calc. Raman is living proof that -calc is a useful tool for so many situations, and it always pays to have emacs -running. He also mentioned that he found the explanation in the calc tutorial -about the financial functions to be the clearest he's ever read. - -So, yes, calc can do finance. Let's say that you were sitting in front of a loan -officer, and she told you that for your loan of $500,000, you need to pay in 30 -installments with a 5% interest rate. How much do you need to pay each month? -Wait a second! Stop right there, loan officer! I have calc! - -#+BEGIN_EXAMPLE -M-x calc -500000 (the amount of the loan) -30 (the number of payments) -'5% (equivalent to typing 0.05) -b M (calc-fin-pmt, computing the amount of periodic payments to amortize a loan) - -Result: -1: 25,000 -#+END_EXAMPLE - -OK, but that's a bit obvious, since $25,000 is just 5% of $500,000. If the -number of payments was much smaller, we'd get a larger value. Let's take another -question: if you wanted to only pay $10,000 in each installment? How many -installments would it take to pay off the loan? - -#+BEGIN_EXAMPLE -'5% -10000 (the payment we want to make) -500000 (the loan amount) -b # (calc-fin-nper, calculate the number of installments needed) - -Result -1: nper(0.05, 10,000, 500,000) -#+END_EXAMPLE - -What? Oh, I see, I also go the message: "Payment too small to cover interest -rate: 10000". Oh, right, 5% of $500,000 is already $25,000, so we'd never pay it -off at that rate. What if we payed $50,000 instead? - -#+BEGIN_EXAMPLE -'5% -50000 (the payment we want to make) -500000 (the loan amount) -b # - -Result: -1: 14.2066908 -#+END_EXAMPLE - -So, it would take just over 14 payments to pay off the loan. - -OK, one more cool one: Let's say you meet an investment banker who gives you the -following deal. I've got a investment for you, she says. Just give me $100,000 -and I'll give you $10,000 at the end of each year for the next 12 years. -Assuming the interest rate will stay at 3% for the next 12 years. Is it a good -deal? - -Hey, what are you asking me for? I have no idea! Calc knows, though, because it -can tell you the break-even point for the cost of an investment that gives -periodic payments. - -#+BEGIN_EXAMPLE -'3% (the interest rate) -12 (the number of payments) -10000 (the payment you get each time) -b P (calc-fin-pv, calculate the "present value" of the investment, the break-even point for the investment) - -Result: -1: 99,540.0399357 -#+END_EXAMPLE - -In other words, the break-even point for the initial cost is $99,540. If the -investment costs more than this, it's no good at that assumed interest rate. -Better reject the deal. Trust calc more than any investment banker. - -This is just a small sampling of some of the financial calculations that calc -can perform. The next time you are making an investment, fire up calc. You'll -not only have confidence in the deal, you may just amaze someone with the power -of emacs, just like T.V. Raman did. - -** Fractional Arithmetic - -This one is pretty short, but it's about one of my favorite features of calc: -the ability to handle fractions as fractions instead of rendering them as real -numbers. - -Quick, what's =5/8 + 9/21=? - -Um, ok... better start multiplying things... wait, let's just tell calc to do -it. - -#+BEGIN_EXAMPLE -M-x calc -5:8 (this is how you enter a fraction) -9:21 -+ - -Result: -1: 59/56 -#+END_EXAMPLE - -So easy! If we want to convert it to a float you can do this: - -#+BEGIN_EXAMPLE -c f (convert to -float) - -Result: - -1: 1.05357142857*10.^0 -#+END_EXAMPLE - -And if you want it back as a fraction, then just do: - -#+BEGIN_EXAMPLE -c F (convert to fraction) - -Result: - -1: 59/56 -#+END_EXAMPLE - -That's so awesome! - -You could also enter fractions this way: - -#+BEGIN_EXAMPLE -m f (set fraction mode, integer division will result in fractions) -5 -8 -/ - -Result: - -1: 5/8 -#+END_EXAMPLE - -Now you can live in the nice world of fractions as much as you like. It's a nice -world, full of pleasant to look at integers taking up little horizontal space - -** HEX - -OK, seems like there's interest in some quick calc tips. Here's today's: - -How to convert decimal to hexidecimal. Let's say you want to convert number -12345 to hex. - -#+BEGIN_EXAMPLE -M-x calc -d 6 (sets the number radix to 16, meaning all output will be in hex) -10#12345 (inputs the number 12345 in base 10) - -The output reads: -1: 16#3039 -#+END_EXAMPLE - -The answer is therefore =0x3039=. - -And then you can do a =d 0= to set the number radix back to normal, base 10. - -Here's how to do the other way. Let's convert =0xABCDEF= to base 10. - -#+BEGIN_EXAMPLE -M-x calc -16#ABCDEF - -The output reads: -1: 11259375 -#+END_EXAMPLE - -** More on Algebra - -Jim is 42 years old. He has one brother, and their total age is 100. What is the -brother's age? OK, this isn't a very hard problem, but let's just introduce calc -algebra by solving it. - -#+BEGIN_EXAMPLE -M-x calc -'42 + x = 100 (' to enter algebraic input) -a S x (solve for x) - -Result: -1: x = 58 -#+END_EXAMPLE - -Let's make this harder. Jim and Dan's ages sum to 100. Jim is 5 years older than -Dan. How old are they? - -#+BEGIN_EXAMPLE -'[j + d = 100, d + 5 = j] -a S j,d - -Result: -1: [j = 52.5, d = 47.5] -#+END_EXAMPLE - -Nice! - -And of course it can give you more than just numerical solutions: - -#+BEGIN_EXAMPLE -'sin(x) + tan(y) = pi / 2 -a S y (solve for y) - -Result: -1: y = arctan(pi / 2 - sin(x)) -#+END_EXAMPLE - -Sometimes there are more than one solution. For example: -#+BEGIN_EXAMPLE -'x^2 = 25 -a S x - -Result: -1: x = 5 -#+END_EXAMPLE - -Wait, what happened to -5! That's a valid solution, why didn't calc tell us -about it? What's happening here is that calc is telling us about the first valid -thing it can find, which is basically how it operates. But you can always get -everything: - -#+BEGIN_EXAMPLE -'x^2 = 25 -a P x (find the polynomial solutions) - -Result: -1: [5, -5] -#+END_EXAMPLE - -Sometimes there aren't a finite number of results because you aren't dealing -with polynomials. You can just get a generalized solution: - -#+BEGIN_EXAMPLE -'sin(x)^2 = 25 -H a S x (solve for x, giving the generalized solution) - -Result: -1: x = arcsin(5 s1) (-1)^n1 + 180 n1 -#+END_EXAMPLE - -This uses the calc notation =n1=, which you just means any integer. You can also -see another notation =s1= which means any sign. In this case =5 s1= means that that -number can be 5 or -5. - -Looking at how awesome calc is, it's just a shame I never knew about it in high -school... - -** Pi and Precision - -This one's about p and P and mostly about pi. - -First, let's pi it up: - -#+BEGIN_EXAMPLE -M-x calc -P (this gives you pi) - -Result: -1: 3.14159265359 -#+END_EXAMPLE - -Well, I guess that's a reasonable pi. But, c'mon, this is calc. Can't we get a -bit more digits? How about 100? - -#+BEGIN_EXAMPLE -p 100 (sets precisions to 100) -P (need to ask calc again for pi, it doesn't recalculate) - -Result: -1: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 -#+END_EXAMPLE - -Well, but actually evaluating it robs it of its never-ending charm. Let's just -use it as a variable. How about calculating the area of a circle with a 5 km -radius? - -#+BEGIN_EXAMPLE -'5000 m -2 -^ -'pi (enter pi as a variable) -* - -We get: -1: 25000000 m^2 pi -#+END_EXAMPLE - -Yeah, sure that’s what I said I wanted, but I’ve changed my mind - now I want a number. - -#+BEGIN_EXAMPLE -= - -1: 78539816.3397448309615660845819875721049292349843776455243736148076954101571552249657008706335529267 m^2 -#+END_EXAMPLE - -Whoops, looked like I forgot to set the precision back to normal. And I can't -read this. Let's make it a bit nicer. - -#+BEGIN_EXAMPLE -Control-_ (normal emacs undo) -p 7 -d g (turn digit grouping on) -= - -Result: -1: 7.853983e7 m^2 -#+END_EXAMPLE - -Oh, that's because I didn't have enough precision to render it without resorting -to scientific notation. Let's just bump the precision up again. - -#+BEGIN_EXAMPLE -Control-_ (undo, since we have to redo the pi conversion with more precision) -p 10 -= - -Result: -1: 78,539,816.35 m^2 -#+END_EXAMPLE - -Ah, that's better. - -** Random - -I use calc whenever I need a random number. The interface is easy and the random -numbers are (supposedly) high quality. - -So, let's start with something simple: A random number between 0 and 100: - -#+BEGIN_EXAMPLE -M-x calc -100 (the upper bound, all values will be between 0 and this) -k r (creates a random number between 0 and the number on the stack) - -Result: -1: 66 (of course, yours will be different) -#+END_EXAMPLE - -I want another one! -#+BEGIN_EXAMPLE -k a (creates another number with the same upper bound as the last) -#+END_EXAMPLE - -Now that I’ve had a taste of that sweet sweet randomness, I want a vector of 50! - -#+BEGIN_EXAMPLE -100 (the upper bound, again) -50 (the number to generate) -k h (generate a vector of 50 random numbers between 0 and 100) - -1: [60, 72, 61, 74, 77, 97, 10, 90, 8, 29, 82, 81, 51, 58, 7, 88, 99, 1, 37, 89, 93, 84, 52, 94, 2, 35, 5, 48, 87, 47, 14, 6, 79, 18, 67, 76, 70, 9, 43, 65, 69, 23, 55, 11, 53, 78, 50, 30, 13, 42] -#+END_EXAMPLE - -OK, that's nice. But how about a number between 0 and 1? - -#+BEGIN_EXAMPLE -1.0 -k r - -Result: -1: 0.636988102539 -#+END_EXAMPLE - -OK, how about number between -50 and 50? For that we need to use what calc calls -an interval form: - -#+BEGIN_EXAMPLE -[ (Starts interval form) -50 (You can't just type -50 in calc) -n (negate, givint -50) -.. (the middle part of the interval form) -50] (closing the interval form) -#+END_EXAMPLE - -What you see now in calc is: -#+BEGIN_EXAMPLE -[-50 .. 50] -#+END_EXAMPLE -And you could have just typed it in with: -#+BEGIN_EXAMPLE -'[-50 .. 50] -#+END_EXAMPLE -which would be a lot easier, really. - -#+BEGIN_EXAMPLE -k r -#+END_EXAMPLE -This produces a random number from the bounds of the interval, in this case both --50 and 50 are possible, if you wanted them to be exlusive bounds, you'd use the -form =(-50 .. 50)=. - -Finally, you can re-arrange a list: -#+BEGIN_EXAMPLE -'[1 2 3 4] (our starting vector) --1 (signals to use the vector above, could also be the size of the vector) -k h - -Result: -1: [3, 1, 4, 2] -#+END_EXAMPLE - -But =k a= will not give you more variants, unfortunately. - -** Strings - -Did you know you could work with strings in calc? For an example, let's find out -what "Hello world" is in binary: - -#+BEGIN_EXAMPLE -M-x calc -d 2 (change the to binary mode) -"Hello world (Enter the string "Hello world" which turns into a vector of numbers) - -Result: -1: [2#1001000, 2#1100101, 2#1101100, 2#1101100, 2#1101111, 2#100000, 2#1110111, 2#1101111, 2#1110010, 2#1101100, 2#1100100] -#+END_EXAMPLE - -And similarly, we can convert back. If someone gave you the binary number: -=01001000011011110110110001100001= and asked what the string was, I'd have no -idea... but calc knows: - -#+BEGIN_EXAMPLE -d " (changes to string mode) -C-x b scratch (whaaa, leave calc?) -01001000011011110110110001100001 (enter the number we're parsing) -C-a (go to the start of the line) -C-x ( (start a macro) -2# (prefix the number with a binary indicator) -C-u 8 C-f (Jump forward 8 characters) - (insert a space to separate the numbers) -C-x ) (end the macro) -C-x e (repeat the macro) -e e (repeat twice twice more) -C- (set mark) -C-a (goto beginning of line) -C-x g (copy region into calc) - -Result: - -1: "Hola" -#+END_EXAMPLE - -And there you have it! Maybe there is an easier way to convert from the giant -binary number to a vector of bytes, but I don't know it yet. - -** Time - -Hey, what's the time? It's time to get ill! No, actually I meant the time in -seconds since the epoch. Yesterday I went over doing math with time, which is -fun but not something I use everyday. Much more useful is converting to and from -Unix timestamps. - -Let's start by getting the time now in seconds since the epoch: - -#+BEGIN_EXAMPLE -M-x calc -t N (get the time now) -t U (convert the time to seconds since the epoch) - -Result: -1: 1359424746 -#+END_EXAMPLE - -Oh, and you want to insert that into your last used buffer? - -#+BEGIN_EXAMPLE -y (that doesn't mean "yes", that means yank into the last buffer) -#+END_EXAMPLE - -Done! Just to be complete, let's convert another date we have to input: - -#+BEGIN_EXAMPLE -'<12:00pm Jul 4, 1776> (single quote to enter algebraic mode, then the date) -t U (converts the time to seconds since the epoch) -#+END_EXAMPLE - -But wait, what will happen? This is considerably before the epoch. - -#+BEGIN_EXAMPLE -Result: -1: -6106003200 -#+END_EXAMPLE - -Oh calc, you never let me down. - -Let's do the other way. Remember the Billenium? - -#+BEGIN_EXAMPLE -1e9 -t U (converts the time in seconds since the epoch to text) - -Result: -1: <9:46:40pm Sat Sep 8, 2001> -#+END_EXAMPLE - -Wow, I never realized how close the Billenium was to September 11th. Kind of spooky... - -** Unit Conversion - -You load 16 tons, and what do you get? I mean, in kilograms. - -#+BEGIN_EXAMPLE -M-x calc -' 16 tons (' to enter algebraic mode, so you can type out the units) -u c kg (u c for "unit convert", and kg being the target unit). - -Result: -1: 14514.95584 kg -#+END_EXAMPLE - -Calc treats units as special. If you added something, such as: - -#+BEGIN_EXAMPLE -3 -+ - -Result: -1: 14514.95584 kg + 3 -#+END_EXAMPLE - -But you can remove the units from the above using: -#+BEGIN_EXAMPLE -u r (remove units) - -Result: -1: 14517.95584 -#+END_EXAMPLE - -OK, that's all well and good. But I've always wondered how much is Grandpa -Simpson's gas mileage when he said "My car gets 40 rods to the hogshead and -that's the way I likes it." - -For that, we need to define the units. Calc knows about a lot of units, but -maybe not the rod and hogshead. In fact, in the calc info pages, defining what a -"rod" is the example for how to define your own units. Let's get started! - -#+BEGIN_EXAMPLE -'16 ft (The equivalent to one rod) -u d rod Rod (defines a new unit rod, with optional description "Rod") -#+END_EXAMPLE -Now a hogshead is a unit of measurement that varies by what liquid it contains. -I don't know what the unit is for gasoline, but let's use sherry as a -substitute, in which a hogshead is 245 liters. - -#+BEGIN_EXAMPLE -'245 liters -u d hogshead (don't bother with a description this time) -'40 rod -'1 hogshead -/ -#+END_EXAMPLE -Wait, what units should we be using? -#+BEGIN_EXAMPLE -u v (show the units table, a handy table of all units) -u c mi/gal (the units come from the unit table) - -Result: -1: 1.87280731429e-3 mi / gal -#+END_EXAMPLE - -But wait, we can do better. Why upgrade this measure to something that isn't -even standard? Miles per gallon is just a bit better than rods per hogshead (in -fact, that was what the original joke was about). - -#+BEGIN_EXAMPLE -u c si (convert everything to scientific units) - -Result: -1: 796.212244896 / m^2 -#+END_EXAMPLE - -Not that I understand this number, but at least in miles per gallon, I can see -that that's not such great fuel economy, but what you do expect from Grandpa? - -OK, one more cool thing, then I'm out of here. Calc can split up numbers into -multiple units. Here's 42 inches in feet and inches: - -#+BEGIN_EXAMPLE -'42 in -u c ft+in (Convert to a mixture of feet and inches) - -Result: -1: 3 ft + 6. in -#+END_EXAMPLE - -Calc, you're sooo coool! - * Irreal A random collection of notes from [[https://irreal.org/blog][Irreal's Blog]].