% Copyright 2018 by Mark Wibrow and Till Tantau
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Free Documentation License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.


\section{Design Principles}

\pgfname{} needs to perform many computations while typesetting a picture. For
this, \pgfname\ relies on a mathematical engine, which can also be used
independently of \pgfname, but which is distributed as part of the \pgfname\
package nevertheless. Basically, the engine provides a parsing mechanism
similar to the \calcname{} package so that expressions like |2*3cm+5cm| can be
parsed; but the \pgfname\ engine is more powerful and can be extended and
enhanced.

\pgfname{} provides enhanced functionality, which permits the parsing of
mathematical operations involving integers and non-integers with or without
units. Furthermore, various functions, including trigonometric functions and
random number generators can also be parsed (see
Section~\ref{pgfmath-parsing}). The \calcname{} macros |\setlength| and friends
have \pgfname{} versions which can parse these operations and functions (see
Section~\ref{pgfmath-registers}). Additionally, each operation and function has
an independent \pgfname{} command associated with it (see
Section~\ref{pgfmath-commands}), and can be accessed outside the parser.

The mathematical engine of \pgfname\ is implicitly used whenever you specify a
number or dimension in a higher-level macro. For instance, you can write
|\pgfpoint{2cm+4cm/2}{3cm*sin(30)}| or suchlike. However, the mathematical
engine can also be used independently of the \pgfname\ core, that is, you can
also just load it to get access to a mathematical parser.


\subsection{Loading the Mathematical Engine}

The mathematical engine of \pgfname\ is loaded automatically by \pgfname, but
if you wish to use the mathematical engine but you do not need \pgfname\
itself, you can load the following package:

\begin{package}{pgfmath}
    This command will load the mathematical engine of \pgfname, but not
    \pgfname{} itself. It defines commands like |\pgfmathparse|.
\end{package}


\subsection{Layers of the Mathematical Engine}

Like \pgfname\ itself, the mathematical engine is also structured into
different layers:
%
\begin{enumerate}
    \item The top layer, which you will typically use directly, provides the
        command |\pgfmathparse|. This command parses a mathematical expression
        and evaluates it.

        Additionally, the top layer also defines some additional functions
        similar to the macros of the |calc| package for setting dimensions and
        counters. These macros are just wrappers around the |\pgfmathparse|
        macro.

    \item The calculation layer provides macros for performing one specific
        computation like computing a reciprocal or a multiplication. The parser
        uses these macros for the actual computation.
    \item The implementation layer provides the actual implementations of the
        computations. These can be changed (and possibly be made more
        efficient) without affecting the higher layers.
\end{enumerate}


\subsection{Efficiency and Accuracy of the Mathematical Engine}

Currently, the mathematical algorithms are all implemented in \TeX. This poses
some intriguing programming challenges as \TeX{} is a language for typesetting,
rather than for general mathematics, and as with any programming language,
there is a trade-off between accuracy and efficiency. If you find the level of
accuracy insufficient for your purposes, you will have to replace the
algorithms in the implementation layer.

All the fancy mathematical ``bells-and-whistles'' that the parser provides,
come with an additional processing cost, and in some instances, such as simply
setting a length to |1cm|, with no other operations involved, the additional
processing time is undesirable. To overcome this, the following feature is
implemented: when no mathematical operations are required, an expression can be
preceded by |+|. This will bypass the parsing process and the assignment will
be orders of magnitude faster. This feature \emph{only} works with the macros
for setting registers described in Section~\ref{pgfmath-registers}.
%
\begin{codeexample}[code only]
\pgfmathsetlength\mydimen{1cm}  % parsed     : slower.
\pgfmathsetlength\mydimen{+1cm} % not parsed : much faster.
\end{codeexample}
