Menu
PCalc 4 is a brand new version of my veteran calculator application. It is a fully featured scientific calculator for macOS with support for hexadecimal, octal and binary calculations, as well as an optional RPN mode, parentheses, programmable functions, and an extensive set of unit conversions. TSP Seasonal Calculator. Trading Days do not include weekends and holidays. 1MLK = 1 day before MLK. MLK1 = 1 day after MLK. 1EOM = 1 day before End of Month. 3EOM = 3 days before EM. If the base is 2, the antilog of 3 is 8. If the base is the exponential function (making it the natural logarithm), the result will be 20.09. If the base is the exponential function (making it the natural logarithm), the result will be 20.09. Decreasing: x ∈ (− 4, − 2) ∪ (1.5, ∞) Notice that open intervals are used because at x = − 4, − 2, 1.5 the slope of the function is zero. This is where the slope transitions from being positive to negative. PCalc is an excellent calculator app that was one of Federico’s ‘Must Have’ apps of 2016. It’s available on iOS devices, the Apple Watch, and even the Apple TV. Still, you wouldn’t expect it to incorporate 3D animation or augmented reality, but that is exactly what the latest version of PCalc.
'..a solid, stable and feature-rich app, this Mac veteran can still cut it in the world of OS X..' Craig Grannell, Mac Format, June 2014 |
'..whether you’re performing serious scientific calculations, doing high-school physics homework, or just converting everyday measures, PCalc has the features and interface for you..' Dan Frakes, Macworld, March 2014 |
Nearly seven thousand 5-star customer ratings worldwide on the App Store as of May 2014 |
'…the best professional-grade iPhone calculator…' Dr. Drang, The Sweet Setup, November 2013 |
'…what’s perhaps most impressive about PCalc is that TLA Systems has managed to squeeze so much functionality into the program without making it unwieldy; rather, it’s positively fun to use…' Dan Frakes, Macworld, May 2010 |
'…PCalc is the app for those of us that need pure power when computing on the iPhone…' AppAdvice |
'…best calculator for power users…' Rob Griffiths, Macworld, December 2008 |
'..think of it as the Lexus or BMW of Mac calculators. PCalc has a large following of dedicated users because it’s a calculator that does more than the sum of the parts..' Alexis Kayhill, Mac360, October 2008 |
'..for me, buying PCalc was a no-brainer. And I didn’t even need a calculator to figure that out..' Dan Frakes, Macworld, August 2008 |
'..I like it very much!' Guy Kawasaki, Alltop, August 2008 |
'..while I’ve seen a few iPhone apps that are really good, PCalc is the best so far..' John Gruber, Daring Fireball, July 2008 |
'..transforms your iPhone or iPod touch into the coolest scientific calculator ever..' Jason Snell, Macworld, July 2008 |
May 1, 2013 at 11:11 AM by Dr. Drang
If you followed my advice back in December, you bought PCalc for the ridiculously low price of 99¢ during its 20th anniversary sale1 and have been using a first-class calculator for the past four months. Contexts 3 5 1 – fast window switcher software. With Version 2.8 just released, you’re going to see its value explode with two new features: user-defined conversions and user-defined functions.
PCalc added an f(x) key in Version 2.6 as a way to access functions beyond those available on the keys. Initially, the additional functions were limited to whatever the developer, James Thomson, gave us. Here’s me, back in December:
What I’d really like to see, though, is an expansion of these functions. Smooze 1 7 1 0. Things like present value, future value, and internal rate of return are natural for the financial section. And the statistical section could use functions for the normal and inverse normal cumulative distribution.
This was not based on any insider knowledge. High-end calculators have been programmable since the 70s, so it was only natural to expect that functionality to come to PCalc eventually. We just had to wait for James to figure out how he wanted to implement it.2
In this post, I’m going to focus on creating user-defined functions. The creation of user-defined conversions follows almost exactly the same steps and has access to the same set of commands—once you’ve learned how to define functions, you’ll have no trouble defining conversions.
Creating a new function
Start by tapping the f(x) key to see the list of function categories and then tap the Edit key in the lower left corner. You’ll get a ⊞ key in the upper right corner, which will allow you to add new categories. As you can see below, I’ve added three categories: Financial 2, Probability, and Weather.
Tapping the ⊞ key on this screen will create a new category. Tapping that category takes you to a screen where you can rename it and then start defining new functions.
Tapping the new function takes you to a screen where you can rename and define it. PCalc starts you off with two commands: one that puts you in decimal mode (if you weren’t already there) and one that multiplies the current value by the universal constant.
You can change these by tapping them, which will take you to a command editing screen we’ll discuss in a bit, and add new commands by tapping the ⊞ key.
The command set
PCalc gives you 39 commands from which to build your function. Here they are, with descriptions, as they appear in the scrolling list you see as you construct your function.
Seven of the commands have only one part—the command itself with no arguments. These are typically commands that set the calculation mode, like the Decimal Mode command we saw above or the Radians Mode command.
Seventeen of the commands have two parts, in which you have to choose both the command itself and a single argument. The trig, log, and exponential commands work this way, as does the Clear command.
We’ll discuss how to set the argument in a bit.
Nine of the commands have three parts: the command and two arguments. The basic arithmetic commands (My Dear Aunt Sally) fall into this category, as does the command that sets a register.
Finally, six of the commands have four parts: the command and three arguments. These are all branching commands that test one value against another and skip a given number of steps if the test is true.
Variables and constants
Numerical functions need places where they can store numbers and retrieve them from. PCalc provides 29 such places: the X and Y registers, ten memory locations, sixteen registers, and a special register called Tax Rate used in some of the builtin financial functions. In addition to these read/write variables, there are three read-only constants: Pi (π), a uniformly distributed random number between 0 and 1,3 and a user-defined constant called Value.
Here’s PCalc’s scrolling list of variables and constants you can choose from. If you’re setting or changing a value, the constants don’t appear in the list.
The X and Y registers and the memory locations are accessible any time you’re using PCalc. Registers 0-9, A-F, and the Tax Rate are accessible only through the programming environment; they’re the best place to store intermediate results because they don’t alter what the user has stored in memory.
Update: James says the persistence of the registers is part of the design, so it’s safe to take advantage of that if you want.
A simple example
Let’s look at a five-step function for calculating the future value of an investment. The formula is elementary:
[FV = PV ; (1 + i)^n]where (FV) is the future value, (PV) is the present value, (i) is the interest rate per compounding period, and (n) is the number of compounding periods.
![Pcalc Pcalc](https://i0.wp.com/is2-ssl.mzstatic.com/image/thumb/Purple71/v4/a8/13/5d/a8135d2d-c6f8-cb19-7fe0-8417795119f1/mzl.wdnxcued.png/800x500bb.jpg?ssl=1)
The function I defined calculates just the ((1 + i)^n) part. It gives, in effect, the multiplier associated with the compounding. Here’s the function defined in PCalc:
It expects the interest rate in the Y register and the number of compounding periods in the X register; it returns the future value multiplier in the X register. To run this function in RPN mode, which is what I use, you type in the interest rate, tap Enter, type in the number of compounding periods, and then select the Future Value function from under the f(x) key. In algebraic mode, you type in the interest rate, tap the x~y key, type the number of compounding periods, and then select the Future Value function from under the f(x) key. It’s the same amount of work either way.
James has decided that functions that need more than two arguments will have to use the memory locations for the extra arguments. I’d much prefer to be able to load up the RPN stack with all my arguments (it’s faster than entering values into memory), but that would leave the algebraic users out in the cold.
Sharing functions
You can share the functions you write with others by tapping the share button and sending an email with the functions bundled up in an attachment. When the recipient gets the email, she can tap on the attachment and choose to import them into her copy of PCalc.
It’s my understanding that functions you define on one iOS device will be automatically available on your other iOS devices through iCloud syncing. With only an iPhone, I have no way of testing this.
Programming on your computer
For functions with only a few steps, the tap-scroll-tap method of creating functions on an iPhone or iPad is just fine. But for more complicated functions, it’s easy to get lost and make mistakes. Fortunately, there’s a way to program PCalc in your favorite text editor.
When you send an email with a shared bundle of functions, the attachment is a plist file with a
.pcalcfunctions
extension. If you save this file to your computer, you can open it in a text editor to see the usual plist structure. Each function is a <dict>
, with its code stored in a string using a compact little language. Here’s definition of the Future Value function described above:If we rearrange the string of code, it’s easy to see how it relates to our definition above.
This shows us the path to writing long, complicated functions:
- Create a new function in PCalc. Give it the name you want and put it in the category you want, but don’t bother changing the definition from the two-command default we saw near the top of the post.
- Share that function with yourself via email. Open the email on your computer and save the attached
.pcalcfunctions
file to disk. - Write the function you really want in the little language used in the
,pcalcfunctions
plist. I write mine with each command on its own line and then do a search-and-replace to turn it into a long, semicolon separated string. - Replace the default commands in the
.pcalcfunctions
file with what you just wrote. - Send yourself an email with the edited
.pcalcfunctions
file attached. - Open that attachment on your iOS device to install the redefined function. It’ll replace the old definition.
Pcalc 4 2 0
This may seem like too many steps, but it’s much easier than writing a long function directly in PCalc.
One of the functions I wanted is the cumulative distribution function for the standard normal. There is one of those integrals that can’t be performed analytically, so it has to be approximated. Here’s a good approximation from Abramowitz and Stegun:
And here’s that formula (generalized to handle negative arguments) converted into a PCalc function:
It’s much faster to type the lines than to scroll through the list choosing commands and registers, and it’s easier to see the overall logic this way.
All the command abbreviations
The main difficulty in writing PCalc functions in a text editor is figuring out what the abbreviations are for each of the commands. To help with this, I created, in PCalc, a fake function with 37 steps—one for each of the commands. After sharing this function and opening the
.pcalcfunctions
file on my computer, I extracted all the commands. Here they are with their default arguments and an explanatory comment:These are in the same order as the screenshot list. Most of the names are immediately obvious; others take a little thinking to understand. The inverse power command,
roo
, is short for root.4 The b at the front of beq
and the other skip commands is short for branch. The only one I’ve had trouble remembering is pwr
, which I tend to type as pow
.Finally
A calculator isn’t necessarily the best tool for complicated analyses, but sometimes it’s the best tool that’s readily available. Because PCalc is in my phone, its capabilities—whatever they are—are always with me. The addition of user-defined functions allows me to do calculations away from my desk that I couldn’t do before.
This post wasn’t intended to be a breezy read. Its main purpose is to act as a reference to help you (and me) get new functions written. I don’t know if James intends to host a repository of functions at pcalc.com, but I’ll be putting all my functions in this GitHub repository. At present, it has three sets of functions:
Financial 2.pcalcfunctions
. This has the future value function shown above, a present value function, and a loan payment function.Probability.pcalcfunctions
. This has the standard normal PDF, CDF, and inverse CDF.Weather.pcalcfunctions
. This has functions for calculating the wind chill factor and the heat index.
Pcalc 4 2 Player Games
The README is pretty rudimentary at the moment, but it does explain the inputs and outputs of each function. I’ll be adding better explanations of the underlying calculations soon.
Pcalc 4 2/5
- How can an iOS app be 20 years old? Strictly speaking, it can’t, but its older cousin, PCalc for the Mac, was 20 years old in December, and iOS PCalc joined the celebration. ↩
- There may also have been a question about the iOS developer rules. Programmability used to be a no-no, but with things like Pythonista that restriction has clearly been lifted. ↩
- OK, a random number isn’t a constant, but I lumped it in with the constants because it can’t be written to. ↩
- If you were thinking it had something to do with Winnie the Pooh, you’ve got the wrong beloved English author in mind. If James were going to name a command after a character, it’d be Zaphod Beeblebrox, which would be tough to squeeze into three characters, even with Unicode. ↩