calc: Formulas
5.15 Formulas
=============
When you press the apostrophe key you may enter any expression or
formula in algebraic form. (Calc uses the terms “expression” and
“formula” interchangeably.) An expression is built up of numbers,
variable names, and function calls, combined with various arithmetic
operators. Parentheses may be used to indicate grouping. Spaces are
ignored within formulas, except that spaces are not permitted within
variable names or numbers. Arithmetic operators, in order from highest
to lowest precedence, and with their equivalent function names, are:
‘_’ [‘subscr’] (subscripts);
postfix ‘%’ [‘percent’] (as in ‘25% = 0.25’);
prefix ‘!’ [‘lnot’] (logical “not,” as in ‘!x’);
‘+/-’ [‘sdev’] (the standard deviation symbol) and ‘mod’ [‘makemod’]
(the symbol for modulo forms);
postfix ‘!’ [‘fact’] (factorial, as in ‘n!’) and postfix ‘!!’
[‘dfact’] (double factorial);
‘^’ [‘pow’] (raised-to-the-power-of);
prefix ‘+’ and ‘-’ [‘neg’] (as in ‘-x’);
‘*’ [‘mul’];
‘/’ [‘div’], ‘%’ [‘mod’] (modulo), and ‘\’ [‘idiv’] (integer
division);
infix ‘+’ [‘add’] and ‘-’ [‘sub’] (as in ‘x-y’);
‘|’ [‘vconcat’] (vector concatenation);
relations ‘=’ [‘eq’], ‘!=’ [‘neq’], ‘<’ [‘lt’], ‘>’ [‘gt’], ‘<=’
[‘leq’], and ‘>=’ [‘geq’];
‘&&’ [‘land’] (logical “and”);
‘||’ [‘lor’] (logical “or”);
the C-style “if” operator ‘a?b:c’ [‘if’];
‘!!!’ [‘pnot’] (rewrite pattern “not”);
‘&&&’ [‘pand’] (rewrite pattern “and”);
‘|||’ [‘por’] (rewrite pattern “or”);
‘:=’ [‘assign’] (for assignments and rewrite rules);
‘::’ [‘condition’] (rewrite pattern condition);
‘=>’ [‘evalto’].
Note that, unlike in usual computer notation, multiplication binds
more strongly than division: ‘a*b/c*d’ is equivalent to ‘(a*b)/(c*d)’.
The multiplication sign ‘*’ may be omitted in many cases. In
particular, if the righthand side is a number, variable name, or
parenthesized expression, the ‘*’ may be omitted. Implicit
multiplication has the same precedence as the explicit ‘*’ operator.
The one exception to the rule is that a variable name followed by a
parenthesized expression, as in ‘f(x)’, is interpreted as a function
call, not an implicit ‘*’. In many cases you must use a space if you
omit the ‘*’: ‘2a’ is the same as ‘2*a’, and ‘a b’ is the same as ‘a*b’,
but ‘ab’ is a variable called ‘ab’, _not_ the product of ‘a’ and ‘b’!
Also note that ‘f (x)’ is still a function call.
The rules are slightly different for vectors written with square
brackets. In vectors, the space character is interpreted (like the
comma) as a separator of elements of the vector. Thus ‘[ 2a b+c d ]’ is
equivalent to ‘[2*a, b+c, d]’, whereas ‘2a b+c d’ is equivalent to
‘2*a*b + c*d’. Note that spaces around the brackets, and around
explicit commas, are ignored. To force spaces to be interpreted as
multiplication you can enclose a formula in parentheses as in ‘[(a b)
2(c d)]’, which is interpreted as ‘[a*b, 2*c*d]’. An implicit comma is
also inserted between ‘][’, as in the matrix ‘[[1 2][3 4]]’.
Vectors that contain commas (not embedded within nested parentheses
or brackets) do not treat spaces specially: ‘[a b, 2 c d]’ is a vector
of two elements. Also, if it would be an error to treat spaces as
separators, but not otherwise, then Calc will ignore spaces: ‘[a - b]’
is a vector of one element, but ‘[a -b]’ is a vector of two elements.
Finally, vectors entered with curly braces instead of square brackets do
not give spaces any special treatment. When Calc displays a vector that
does not contain any commas, it will insert parentheses if necessary to
make the meaning clear: ‘[(a b)]’.
The expression ‘5%-2’ is ambiguous; is this five-percent minus two,
or five modulo minus-two? Calc always interprets the leftmost symbol as
an infix operator preferentially (modulo, in this case), so you would
need to write ‘(5%)-2’ to get the former interpretation.
A function call is, e.g., ‘sin(1+x)’. (The Calc algebraic function
‘foo’ corresponds to the Emacs Lisp function ‘calcFunc-foo’, but unless
you access the function from within Emacs Lisp, you don’t need to worry
about it.) Most mathematical Calculator commands like ‘calc-sin’ have
function equivalents like ‘sin’. If no Lisp function is defined for a
function called by a formula, the call is left as it is during algebraic
manipulation: ‘f(x+y)’ is left alone. Beware that many innocent-looking
short names like ‘in’ and ‘re’ have predefined meanings which could
surprise you; however, single letters or single letters followed by
digits are always safe to use for your own function names.
Function Index.
In the documentation for particular commands, the notation ‘H S’
(‘calc-sinh’) [‘sinh’] means that the key sequence ‘H S’, the command
‘M-x calc-sinh’, and the algebraic function ‘sinh(x)’ all represent the
same operation.
Commands that interpret (“parse”) text as algebraic formulas include
algebraic entry (‘'’), editing commands like ‘`’ which parse the
contents of the editing buffer when you finish, the ‘C-x * g’ and
‘C-x * r’ commands, the ‘C-y’ command, the X window system “paste” mouse
operation, and Embedded mode. All of these operations use the same
rules for parsing formulas; in particular, language modes (
Language Modes) affect them all in the same way.
When you read a large amount of text into the Calculator (say a
vector which represents a big set of rewrite rules; Rewrite
Rules), you may wish to include comments in the text. Calc’s formula
parser ignores the symbol ‘%%’ and anything following it on a line:
[ a + b, %% the sum of "a" and "b"
c + d,
%% last line is coming up:
e + f ]
This is parsed exactly the same as ‘[ a + b, c + d, e + f ]’.
Syntax Tables, for a way to create your own operators and
other input notations. Compositions, for a way to create new
display formats.
Algebra, for commands for manipulating formulas symbolically.