We are making changes to some of the math functions, in particular the trigonometric and logarithmic functions. To do that we also need to rename the existing log function, used for debugging.

Pencil Code is being used for more and more things! One area we looked at recently was use of the trigonometric functions. Those are cos, sin, tan, and their inverse forms, acos, acos, atan, and atan2. Those functions are useful for dealing with angles, such as when doing turtle geometry. Turtle turns are expressed in units of degrees, so it helps that the trig functions measure angles in degrees.

When you learn trigonometry in high school and beyond, measurement of angles switches to radians. Some Pencil Code users have figured out that the underlying Javascript Math library has trig functions in radians. We noticed that many Pencil Code programs use Math.cos, Math.sin, and so on.

Both degrees and radians are useful, for different types of programs. We have decided to incorporate both forms of the trig functions directly into Pencil Code, and make a clear distinction between them. In doing so, we follow the lead of mathematical languages such as Fortran, MatLab, and Wolfram Alpha. cosd, sind, tand, acosd, asind, and atand will operate in degrees, and cos, sin, tan, acos, asin, and atan will operate in radians.

cosine sine tangent arccosine arcsine arctangent
degrees cosd sind tand acosd asind atand
radians cos sin tan acos asin atan

One further change we're making is to remove atan2. Of course, that function is very useful, so we're incorporating what it does into atan and atand. If you provide two arguments to atan or atand, they will act like atan2 or atan2d would act. You can think of atan and atand as being 2-argument functions, where the second argument defaults to 1:

atan  = (y, x = 1) -> ...
atand = (y, x = 1) -> ...

So we're changing the behavior of the old trig functions. They used to operate in degrees, and now operate in radians. To minimize the impact of this change, we have modified most of your existing programs that use old trig functions, to use the new degrees forms. Those modified programs should continue to work, just as before. There were a few programs where we weren't sure what to do. We left those alone. We did not change existing uses of the Math. forms of the trig functions. But if you wanted to, you could switch to the shorter names, and your program will continue to work as it did.

Another change we will make (not yet, but soon) involves the logarithmic functions, ln and log10. We will remove them and replace them with a single log function that takes an optional second argument. If you call log with a single argument, the function will return the natural logarithm, just as the existing ln function does now. If you supply a second argument, it specifies the base of the logarithm. So log(x, 10) will return the log base 10, just as log10(x) would now. But as you can imagine, you can use other numbers for the base, as needed for your problem. For example, log(x, 2) might be useful for figuring out how many bits are needed to encode a number in binary.

Unfortunately, log is currently a function useful for printing things while you're debugging. To prepare for the upcoming change, we have added a new function, debug, which will do the debug printing that log currently does. For now, log still exists and will do what it has been doing, but it will be noted as deprecated. We have modified your existing programs that use log to use debug instead. Some of you figured out that you could use the Javascript console.log function to do this debug printing. That will continue to work, and we did not change those uses. For now we have left uses of ln and log10 intact. We will change those when we change log to be the logarithm function, instead of the debugging function.

Enjoy the new, expanded set of math functions, to do even more great things with Pencil Code!

Bob Cassels