1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
% Copyright 2008 by Mark Wibrow
%
% 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{Fixed Point Arithmetic Library}
\begin{pgflibrary}{fixedpointarithmetic}
This library provides an interface to the \LaTeX{} package
|fp| for fixed point arithmetic. In addition to loading this
library you must ensure |fp| is loaded otherwise errors
will occur.
\end{pgflibrary}
\subsection{Overview}
Whilst the mathematical engine that comes with \pgfname{} is
reasonably fast and flexible when it comes to parsing, the accuracy
tends to be fairly low, particularly for expressions involving many
operations chained together. In addition the range of values that
can be computed is very small: $\pm16383.99999$.
Conversely, the |fp| package has a reasonably high accuracy, and
can perform computations over a wide range of
values (approximately $\pm9.999\times10^{17}$), but is comparatively
slow and not very
flexible, particularly regarding parsing.
This library enables the combination of the two: the flexible parser
of the \pgfname{} mathematical engine with the evaluation accuracy
of |fp|. There are, however, a number of important points to
bear in mind:
\begin{itemize}
\item
Whilst |fp| supports very large numbers, \pgfname{} and
\tikzname{} do not. It is possible to calculate the result of
|2^20| or |1.2e10+3.4e10|, but it is not possible to use these
results in pictures directly without some ``extra work''.
\item
The \pgfname{} mathematical engine will still be used to evaluate
lengths, such as |10pt| or |3em|, so it is not possible for an
length to exceed the range of values supported by
\TeX-dimensions ($\pm16383.99999$pt), even though the resulting
expression is within the range of |fp|. So, for example, one can
calculate |3cm*10000|, but not |3*10000cm|.
\item
Not all of the functions listed in Section~\ref{pgfmath-syntax},
have been mapped onto |fp| equivalents. Of those that have been,
it is not guaranteed that functions will perform in the same way as
they do in \pgfname. Reference should be made to the documentation
for |fp|.
\item
In \pgfname, trigonometric functions such as |sin| and |cos| assume
arguments are in degrees, and functions such as |asin| and |acos|
return results in degrees. Although |fp| uses radians for such
functions, \pgfname{} automatically converts arguments from degrees
to radians, and converts results from radians to degrees, to ensure
everything ``works properly''.
\item
The overall speed will actually be slower than using
\pgfname{} mathematical engine. The calculating power of |fp|
comes at the cost of an increased processing time.
\end{itemize}
\subsection{Using Fixed Point Arithmetic in PGF and \tikzname}
The following key is provided to use |fp| in \pgfname{}
and \tikzname:
\begin{key}{/pgf/fixed point arithmetic=\meta{options}}
\keyalias{tikz}
This key will set the key path to |/pgf/fixed point|, and
execute \meta{options}. Then it will install the necessary
commands so that the \pgfname{} parser will use |fp| to perform
calculations.
The best way to use this key is as an argument to a scope or
picture. This means that |fp| does not always have to be used,
and \pgfname{} can use its own mathematical engine at other times,
which can lead to a significant reduction in the time for a document
to compile.
\end{key}
Currently there are only a few keys key supported for \meta{options}:
\begin{key}{/pgf/fixed point/scale results=\meta{factor}}
As noted above, |fp| can process a far greater range of numbers
than \pgfname{} and \tikzname{}. In order to use results from
|fp| in a |{pgfpicture}| or a |{tikzpicture}| they need to be
scaled. When this key is used \pgfname{} will scale results
of any evaluation by \meta{factor}. However, as it is not
desirable for every part of every expression to be scaled,
scaling will only take place if a special prefix |*| is used.
If |*| is used at the beginning of an expression the evaluation
of the expression will evaluated and then multiplied by
\meta{factor}.
\begin{codeexample}[]
\begin{tikzpicture}[fixed point arithmetic={scale results=10^-6}]
\draw [help lines] grid (3,2);
\draw (0,0) -- (2,2);
\draw [red, line width=4pt] (*1.0e6,0) -- (*3.0e6,*2.0e6);
\end{tikzpicture}
\end{codeexample}
A special case of scaling involves plots of data containing
large numbers from files.
It is possible to ``pre-process'' a file, typically using the
application that generates the data, to either precede
the relevant column with |*| or to perform the scaling as part
of the calculation process. However, it may be desirable for
the data in a plot to appear in a table as well, so, two files would
be required, one pre-processed for plotting, and one not. This
extra work may be undesirable so the following keys are provided:
\begin{key}{/pgf/fixed point/scale file plot x=\meta{factor}}
This key will scale the first column of data read from
a file before it is plotted. It is independent of the
|scale results| key.
\end{key}
\begin{key}{/pgf/fixed point/scale file plot y=\meta{factor}}
This key will scale the second column of data read from
a file before it is plotted.
\end{key}
\begin{key}{/pgf/fixed point/scale file plot z=\meta{factor}}
This key will scale the third column of data read from
a file before it is plotted.
\end{key}
\end{key}
|