You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
803 lines
28 KiB
803 lines
28 KiB
% Copyright 2007 by Mark Wibrow
|
|
%
|
|
% This file may be distributed and/or modified
|
|
%
|
|
% 1. under the LaTeX Project Public License and/or
|
|
% 2. under the GNU Public License.
|
|
%
|
|
% See the file doc/generic/pgf/licenses/LICENSE for more details.
|
|
|
|
% This file defines the mathematical functions and operators.
|
|
%
|
|
% Version 1.4142135 25/8/2008
|
|
|
|
% add function.
|
|
%
|
|
\pgfmathdeclarefunction{add}{2}{%
|
|
\begingroup%
|
|
\pgfmath@x=#1pt\relax%
|
|
\pgfmath@y=#2pt\relax%
|
|
\advance\pgfmath@x by\pgfmath@y%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
|
|
% subtract function.
|
|
%
|
|
\pgfmathdeclarefunction{subtract}{2}{%
|
|
\begingroup%
|
|
\pgfmath@x=#1pt\relax%
|
|
\pgfmath@y=#2pt\relax%
|
|
\advance\pgfmath@x by-\pgfmath@y%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% neg function.
|
|
%
|
|
\pgfmathdeclarefunction{neg}{1}{%
|
|
\begingroup%
|
|
\pgfmath@x=-#1pt\relax%
|
|
\edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
|
|
\pgfmath@smuggleone\pgfmathresult%
|
|
\endgroup%
|
|
}
|
|
% change the precedence for neg.
|
|
% Otherwise, unary minus and exponentiation won't have the correct precedence
|
|
% (test '-2^2')
|
|
\def\pgfmath@operation@neg@precedence{500}
|
|
|
|
% multiply function.
|
|
%
|
|
\pgfmathdeclarefunction{multiply}{2}{%
|
|
\begingroup%
|
|
\pgfmath@x=#1pt\relax%
|
|
\pgfmath@y=#2pt\relax%
|
|
\pgfmath@x=\pgfmath@tonumber{\pgfmath@y}\pgfmath@x%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% divide function.
|
|
%
|
|
\newif\ifpgfmath@divide@period
|
|
|
|
\pgfmathdeclarefunction{divide}{2}{%
|
|
\begingroup%
|
|
\pgfmath@x=#1pt\relax%
|
|
\pgfmath@y=#2pt\relax%
|
|
\let\pgfmath@sign=\pgfmath@empty%
|
|
\ifdim0pt=\pgfmath@y%
|
|
\pgfmath@error{You've asked me to divide `#1' by `#2', %
|
|
but I cannot divide any number by `#2'}%
|
|
\fi%
|
|
\afterassignment\pgfmath@xa%
|
|
\c@pgfmath@counta\the\pgfmath@y\relax%
|
|
\ifdim0pt=\pgfmath@xa%
|
|
\divide\pgfmath@x by\c@pgfmath@counta%
|
|
\else%
|
|
\ifdim0pt>\pgfmath@x%
|
|
\def\pgfmath@sign{-}%
|
|
\pgfmath@x=-\pgfmath@x%
|
|
\fi%
|
|
\ifdim0pt>\pgfmath@y%
|
|
\expandafter\def\expandafter\pgfmath@sign\expandafter{\pgfmath@sign-}%
|
|
\pgfmath@y=-\pgfmath@y%
|
|
\fi%
|
|
\ifdim1pt>\pgfmath@y%
|
|
\pgfmathreciprocal@{\pgfmath@tonumber{\pgfmath@y}}%
|
|
\pgfmath@x=\pgfmath@sign\pgfmathresult\pgfmath@x%
|
|
\else%
|
|
\def\pgfmathresult{0}%
|
|
\pgfmath@divide@periodtrue%
|
|
\c@pgfmath@counta=0\relax%
|
|
\pgfmathdivide@@%
|
|
\pgfmath@x=\pgfmath@sign\pgfmathresult pt\relax%
|
|
\fi%
|
|
\fi%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
\def\pgfmath@small@number{0.00002}
|
|
|
|
\def\pgfmathdivide@@{%
|
|
\let\pgfmath@next=\relax%
|
|
\ifdim\pgfmath@small@number pt<\pgfmath@x%
|
|
\ifdim\pgfmath@small@number pt<\pgfmath@y%
|
|
\ifdim\pgfmath@y>\pgfmath@x%
|
|
\ifpgfmath@divide@period%
|
|
\expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult.}%
|
|
\pgfmath@divide@periodfalse%
|
|
\fi%
|
|
\pgfmathdivide@dimenbyten\pgfmath@y%
|
|
\ifdim\pgfmath@y>\pgfmath@x%
|
|
\expandafter\def\expandafter\pgfmathresult\expandafter{\pgfmathresult0}%
|
|
\fi%
|
|
\else%
|
|
\c@pgfmath@counta=\pgfmath@x%
|
|
\c@pgfmath@countb=\pgfmath@y%
|
|
\divide\c@pgfmath@counta by\c@pgfmath@countb%
|
|
\pgfmath@ya=\c@pgfmath@counta\pgfmath@y%
|
|
\advance\pgfmath@x by-\pgfmath@ya%
|
|
\def\pgfmath@next{%
|
|
\toks0=\expandafter{\pgfmathresult}%
|
|
\edef\pgfmathresult{\the\toks0 \the\c@pgfmath@counta}%
|
|
}%
|
|
\ifpgfmath@divide@period
|
|
\else
|
|
% we are behind the period. It may happen that the
|
|
% result is more than one digit - in that case,
|
|
% introduce special handling:
|
|
\ifnum\c@pgfmath@counta>9 %
|
|
\expandafter\pgfmathdivide@advance@last@digit\pgfmathresult CCCCC\@@
|
|
\advance\c@pgfmath@counta by-10 %
|
|
\ifnum\c@pgfmath@counta=0
|
|
\let\pgfmath@next=\relax
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\pgfmath@next
|
|
\fi%
|
|
\let\pgfmath@next=\pgfmathdivide@@%
|
|
\fi%
|
|
\fi%
|
|
\pgfmath@next%
|
|
}
|
|
|
|
% advances the last digit found in the number. Any missing digits are
|
|
% supposed to be filled with 'C'.
|
|
\def\pgfmathdivide@advance@last@digit#1.#2#3#4#5#6#7\@@{%
|
|
\pgfmath@ya=\pgfmathresult pt %
|
|
\if#2C%
|
|
\pgfmath@xa=1pt %
|
|
\else
|
|
\if#3C%
|
|
\pgfmath@xa=0.1pt %
|
|
\else
|
|
\if#4C%
|
|
\pgfmath@xa=0.01pt %
|
|
\else
|
|
\if#5C%
|
|
\pgfmath@xa=0.001pt %
|
|
\else
|
|
\if#6C%
|
|
\pgfmath@xa=0.0001pt %
|
|
\else
|
|
\pgfmath@xa=0.00001pt %
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\advance\pgfmath@ya by\pgfmath@xa
|
|
\edef\pgfmathresult{\pgfmath@tonumber@notrailingzero\pgfmath@ya}%
|
|
}%
|
|
|
|
{
|
|
\catcode`\p=12
|
|
\catcode`\t=12
|
|
\gdef\Pgf@geT@NO@TRAILING@ZERO#1.#2pt{%
|
|
#1.%
|
|
\ifnum#2=0 \else #2\fi
|
|
}
|
|
}
|
|
\def\pgfmath@tonumber@notrailingzero#1{\expandafter\Pgf@geT@NO@TRAILING@ZERO\the#1}
|
|
|
|
|
|
\def\pgfmathdivide@dimenbyten#1{%
|
|
\edef\pgfmath@temp{\pgfmath@tonumber{#1}}%
|
|
\expandafter\pgfmathdivide@@dimenbyten\pgfmath@temp\@@#1\@@}
|
|
\def\pgfmathdivide@@dimenbyten#1.#2\@@#3\@@{%
|
|
\pgfmath@tempcnta=#1\relax%
|
|
\divide\pgfmath@tempcnta by10\relax%
|
|
\pgfmath@tempcntb=\pgfmath@tempcnta%
|
|
\multiply\pgfmath@tempcnta by-10\relax%
|
|
\advance\pgfmath@tempcnta by#1\relax%
|
|
#3=\the\pgfmath@tempcntb.\the\pgfmath@tempcnta#2pt\relax%
|
|
}
|
|
|
|
|
|
% reciprocal function.
|
|
%
|
|
\pgfmathdeclarefunction{reciprocal}{1}{%
|
|
\begingroup%
|
|
\expandafter\pgfmath@x#1pt\relax%
|
|
\ifdim\pgfmath@x=0pt\relax%
|
|
\pgfmath@error{You asked me to calculate `1/#1', but I cannot divide any number by zero}{}%
|
|
\fi%
|
|
\edef\pgfmath@reciprocaltemp{\pgfmath@tonumber{\pgfmath@x}}%
|
|
\expandafter\pgfmathreciprocal@@\pgfmath@reciprocaltemp0000000\pgfmath@}
|
|
\def\pgfmathreciprocal@@#1.#2#3#4#5#6#7\pgfmath@{%
|
|
\c@pgfmath@counta#2#3#4#5#6\relax%
|
|
% If the number is an integer, use TeX arithmetic.
|
|
\ifnum\c@pgfmath@counta=0\relax%
|
|
\pgfmath@x1pt\relax%
|
|
\divide\pgfmath@x#1\relax%
|
|
\else%
|
|
\ifnum#1>100\relax%
|
|
\c@pgfmath@counta#1#2#3#4\relax%
|
|
\c@pgfmath@countb1000000000\relax%
|
|
\divide\c@pgfmath@countb\c@pgfmath@counta%
|
|
\c@pgfmath@counta\c@pgfmath@countb%
|
|
\divide\c@pgfmath@counta10000\relax%
|
|
\pgfmath@x\c@pgfmath@counta pt\relax%
|
|
\multiply\c@pgfmath@counta-10000\relax%
|
|
\advance\c@pgfmath@countb\c@pgfmath@counta%
|
|
\pgfmath@y\c@pgfmath@countb pt\relax%
|
|
\divide\pgfmath@y1000000\relax%
|
|
\advance\pgfmath@x\pgfmath@y%
|
|
\else%
|
|
\c@pgfmath@counta#1#2#3#4#5#6\relax%
|
|
\c@pgfmath@countb1000000000\relax%
|
|
\divide\c@pgfmath@countb\c@pgfmath@counta%
|
|
\c@pgfmath@counta\c@pgfmath@countb%
|
|
\divide\c@pgfmath@counta10000\relax%
|
|
\pgfmath@x\c@pgfmath@counta pt\relax%
|
|
\multiply\c@pgfmath@counta-10000\relax%
|
|
\advance\c@pgfmath@countb\c@pgfmath@counta%
|
|
\pgfmath@y\c@pgfmath@countb pt\relax%
|
|
\pgfmath@y.1\pgfmath@y% Yes! This way is more accurate. Go figure...
|
|
\pgfmath@y.1\pgfmath@y%
|
|
\pgfmath@y.1\pgfmath@y%
|
|
\pgfmath@y.1\pgfmath@y%
|
|
\advance\pgfmath@x\pgfmath@y%
|
|
\fi%
|
|
\fi%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% div function.
|
|
%
|
|
\pgfmathdeclarefunction{div}{2}{%
|
|
\begingroup%
|
|
\pgfmathdivide@{#1}{#2}%
|
|
\ifdim\pgfmathresult pt<0pt\relax%
|
|
\pgfmathceil@{\pgfmathresult}%
|
|
\else%
|
|
\pgfmathfloor@{\pgfmathresult}%
|
|
\fi%
|
|
\afterassignment\pgfmath@gobbletilpgfmath@%
|
|
\c@pgfmath@counta=\pgfmathresult\relax\pgfmath@%
|
|
\edef\pgfmathresult{\the\c@pgfmath@counta}%
|
|
\pgfmath@smuggleone\pgfmathresult%
|
|
\endgroup%
|
|
}
|
|
|
|
% mod function.
|
|
%
|
|
\pgfmathdeclarefunction{mod}{2}{%
|
|
\begingroup%
|
|
\pgfmath@xa#1pt%
|
|
\pgfmath@xb#2pt%
|
|
\pgfmath@x\pgfmath@xa%
|
|
\c@pgfmath@counta\pgfmath@xa%
|
|
\c@pgfmath@countb\pgfmath@xb%
|
|
\divide\c@pgfmath@counta\c@pgfmath@countb%
|
|
\multiply\pgfmath@xb\c@pgfmath@counta%
|
|
\advance\pgfmath@x-\pgfmath@xb%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% Mod function (never negative).
|
|
%
|
|
\pgfmathdeclarefunction{Mod}{2}{%
|
|
\begingroup%
|
|
\pgfmathmod@{#1}{#2}%
|
|
\pgfmath@x=\pgfmathresult pt\relax%
|
|
\ifdim\pgfmath@x<0pt\relax%
|
|
\advance\pgfmath@x by#2pt\relax%
|
|
\fi%
|
|
\edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
|
|
\pgfmath@smuggleone\pgfmathresult%
|
|
\endgroup%
|
|
}
|
|
|
|
% abs function.
|
|
%
|
|
\pgfmathdeclarefunction{abs}{1}{%
|
|
\begingroup%
|
|
\expandafter\pgfmath@x#1pt\relax%
|
|
\ifdim\pgfmath@x<0pt\relax%
|
|
\pgfmath@x-\pgfmath@x%
|
|
\fi%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% sign(x)
|
|
\pgfmathdeclarefunction{sign}{1}{%
|
|
\begingroup
|
|
\ifdim#1pt>0sp %
|
|
\def\pgfmathresult{1}%
|
|
\else
|
|
\ifdim#1pt=0sp %
|
|
\def\pgfmathresult{0}%
|
|
\else
|
|
\def\pgfmathresult{-1}%
|
|
\fi
|
|
\fi
|
|
\pgfmath@smuggleone\pgfmathresult
|
|
\endgroup
|
|
}
|
|
|
|
% e constant.
|
|
%
|
|
\pgfmathdeclarefunction{e}{0}{\def\pgfmathresult{2.718281828}}
|
|
|
|
% ln function.
|
|
%
|
|
% This is based on an algorithm due to Rouben Rostamian and
|
|
% uses coefficients contributed by Alain Matthes.
|
|
%
|
|
\pgfmathdeclarefunction{ln}{1}{%
|
|
\begingroup%
|
|
\expandafter\pgfmath@x#1pt\relax%
|
|
\ifdim\pgfmath@x>0pt\else%
|
|
\pgfmath@error{I cannot calculate the logarithm of `#1'}{}%
|
|
\fi%
|
|
\c@pgfmath@counta=0\relax%
|
|
\ifdim\pgfmath@x>2pt\relax%
|
|
\ifdim\pgfmath@x<128pt\relax%
|
|
\ifdim\pgfmath@x<8pt\relax%
|
|
\ifdim\pgfmath@x<4pt\relax%
|
|
\divide\pgfmath@x by2\relax%
|
|
\c@pgfmath@counta=1\relax%
|
|
\else%
|
|
\divide\pgfmath@x by4\relax%
|
|
\c@pgfmath@counta=2\relax%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x<32pt\relax%
|
|
\ifdim\pgfmath@x<16pt\relax%
|
|
\divide\pgfmath@x by8\relax%
|
|
\c@pgfmath@counta=3\relax%
|
|
\else%
|
|
\divide\pgfmath@x by16\relax%
|
|
\c@pgfmath@counta=4\relax%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x<64pt\relax%
|
|
\divide\pgfmath@x by32\relax%
|
|
\c@pgfmath@counta=5\relax%
|
|
\else%
|
|
\divide\pgfmath@x by64\relax%
|
|
\c@pgfmath@counta=6\relax%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x<2048pt\relax%
|
|
\ifdim\pgfmath@x<512pt\relax%
|
|
\ifdim\pgfmath@x<256pt\relax%
|
|
\divide\pgfmath@x by128\relax%
|
|
\c@pgfmath@counta=7\relax%
|
|
\else%
|
|
\divide\pgfmath@x by256\relax%
|
|
\c@pgfmath@counta=8\relax%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x<1024pt\relax%
|
|
\divide\pgfmath@x by512\relax%
|
|
\c@pgfmath@counta=9\relax%
|
|
\else%
|
|
\divide\pgfmath@x by1024\relax%
|
|
\c@pgfmath@counta=10\relax%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x<8192pt\relax%
|
|
\ifdim\pgfmath@x<4096pt\relax%
|
|
\divide\pgfmath@x by2048\relax%
|
|
\c@pgfmath@counta=11\relax%
|
|
\else%
|
|
\divide\pgfmath@x by4096\relax%
|
|
\c@pgfmath@counta =12\relax%
|
|
\fi%
|
|
\else%
|
|
\divide\pgfmath@x by8192\relax%
|
|
\c@pgfmath@counta=13\relax%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x<1pt\relax%
|
|
\ifdim\pgfmath@x>0.0078125pt\relax% 2^-7
|
|
\ifdim\pgfmath@x>0.125pt\relax% 2^-3
|
|
\ifdim\pgfmath@x>0.5pt\relax% 2^-1
|
|
\multiply\pgfmath@x by2\relax%
|
|
\c@pgfmath@counta=-1\relax%
|
|
\else%
|
|
\multiply\pgfmath@x by4\relax%
|
|
\c@pgfmath@counta=-2\relax%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x>0.03125pt\relax% 2^-5
|
|
\ifdim\pgfmath@x>0.0625pt\relax%
|
|
\multiply\pgfmath@x by8\relax%
|
|
\c@pgfmath@counta=-3\relax%
|
|
\else%
|
|
\multiply\pgfmath@x by16\relax%
|
|
\c@pgfmath@counta=-4\relax%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x>0.015625pt\relax% 2^-6
|
|
\multiply\pgfmath@x by32\relax%
|
|
\c@pgfmath@counta=-5\relax%
|
|
\else%
|
|
\multiply\pgfmath@x by64\relax%
|
|
\c@pgfmath@counta=-6\relax%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x>0.00048828125pt\relax% 2^-11
|
|
\ifdim\pgfmath@x>0.001953125pt\relax% 2^-9
|
|
\ifdim\pgfmath@x>0.00390625pt\relax% 2^-8
|
|
\multiply\pgfmath@x by128\relax%
|
|
\c@pgfmath@counta=-7\relax%
|
|
\else%
|
|
\multiply\pgfmath@x by256\relax%
|
|
\c@pgfmath@counta=-8\relax%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x>0.0009765625pt\relax% 2^-10
|
|
\multiply\pgfmath@x by512\relax%
|
|
\c@pgfmath@counta=-9\relax%
|
|
\else%
|
|
\multiply\pgfmath@x by1024\relax%
|
|
\c@pgfmath@counta=-10\relax%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\ifdim\pgfmath@x>0.0001220703125pt\relax% 2^13
|
|
\ifdim\pgfmath@x>0.0002441406256pt\relax% 2^12
|
|
\multiply\pgfmath@x by2048\relax%
|
|
\c@pgfmath@counta=-11\relax%
|
|
\else%
|
|
\multiply\pgfmath@x by4096\relax%
|
|
\c@pgfmath@counta=-12\relax%
|
|
\fi%
|
|
\else%
|
|
\multiply\pgfmath@x by8192\relax%
|
|
\c@pgfmath@counta=-13\relax%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
%
|
|
% Use A+(B+(C+(D+(E+F*x)*x)*x)*x)*x
|
|
%
|
|
% where:
|
|
% A = -2.787927935
|
|
% B = 5.047861502
|
|
% C = -3.489886985
|
|
% D = 1.589480044
|
|
% E = -.4025153233
|
|
% F = 0.04300521312
|
|
%
|
|
\edef\pgfmath@temp{\pgfmath@tonumber{\pgfmath@x}}%
|
|
\pgfmath@x=0.04300521312\pgfmath@x%
|
|
\advance\pgfmath@x by-.4025153233pt\relax%
|
|
\pgfmath@x=\pgfmath@temp\pgfmath@x%
|
|
\advance\pgfmath@x by1.589480044pt\relax%
|
|
\pgfmath@x=\pgfmath@temp\pgfmath@x%
|
|
\advance\pgfmath@x by-3.489886985pt\relax%
|
|
\pgfmath@x=\pgfmath@temp\pgfmath@x%
|
|
\advance\pgfmath@x by5.047861502pt\relax%
|
|
\pgfmath@x=\pgfmath@temp\pgfmath@x%
|
|
\advance\pgfmath@x by-2.787927935pt\relax%
|
|
\advance\pgfmath@x by\c@pgfmath@counta pt\relax%
|
|
\pgfmath@x=0.6931471806\pgfmath@x%
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% log2 function.
|
|
%
|
|
\pgfmathdeclarefunction{log2}{1}{%
|
|
\begingroup%
|
|
\pgfmathln@{#1}%
|
|
\pgfmath@x=\pgfmathresult pt\relax%
|
|
\pgfmath@x=1.442695041\pgfmath@x% 1/ln(2).
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% log10 function
|
|
%
|
|
\pgfmathdeclarefunction{log10}{1}{%
|
|
\begingroup%
|
|
\pgfmathln@{#1}%
|
|
\pgfmath@x=\pgfmathresult pt\relax%
|
|
\pgfmath@x=0.43429441\pgfmath@x% 1/ln(10).
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% This is needed since \pgfmathlog2 and \pgfmathlog10 are not legal macro names
|
|
\expandafter\let\expandafter\pgfmathlogtwo\csname pgfmathlog2\endcsname
|
|
\expandafter\let\expandafter\pgfmathlogtwo@\csname pgfmathlog2@\endcsname
|
|
\expandafter\let\expandafter\pgfmathlogten\csname pgfmathlog10\endcsname
|
|
\expandafter\let\expandafter\pgfmathlogten@\csname pgfmathlog10@\endcsname
|
|
|
|
% exp function.
|
|
%
|
|
\pgfmathdeclarefunction{exp}{1}{%
|
|
\begingroup
|
|
\pgfmath@xc=#1pt\relax
|
|
\pgfmath@yc=#1pt\relax
|
|
\ifdim\pgfmath@xc<-9pt
|
|
\pgfmath@x=1sp\relax
|
|
\else
|
|
\ifdim\pgfmath@xc<0pt
|
|
\pgfmath@xc=-\pgfmath@xc
|
|
\fi
|
|
\pgfmath@x=1pt\relax
|
|
\pgfmath@xa=1pt\relax
|
|
\pgfmath@xb=\pgfmath@x
|
|
\pgfmathloop%
|
|
\divide\pgfmath@xa by\pgfmathcounter
|
|
\pgfmath@xa=\pgfmath@tonumber\pgfmath@xc\pgfmath@xa%
|
|
\advance\pgfmath@x by\pgfmath@xa
|
|
\ifdim\pgfmath@x=\pgfmath@xb
|
|
\else
|
|
\pgfmath@xb=\pgfmath@x
|
|
\repeatpgfmathloop%
|
|
\ifdim\pgfmath@yc<0pt
|
|
\pgfmathreciprocal@{\pgfmath@tonumber\pgfmath@x}%
|
|
\pgfmath@x=\pgfmathresult pt\relax
|
|
\fi
|
|
\fi
|
|
\pgfmath@returnone\pgfmath@x%
|
|
\endgroup
|
|
}
|
|
|
|
% sqrt function.
|
|
%
|
|
\pgfmathdeclarefunction{sqrt}{1}{%
|
|
\begingroup%
|
|
\expandafter\pgfmath@x#1pt\relax%
|
|
\ifdim\pgfmath@x<0pt\relax%
|
|
\pgfmath@error{I cannot calculate the square-root of the negative number `#1'}{}%
|
|
\else%
|
|
\ifdim\pgfmath@x<10pt\relax%
|
|
\def\pgfmath@zeros{0}%
|
|
\def\pgfmath@targetiterations{1}%
|
|
\else%
|
|
\ifdim\pgfmath@x<100pt\relax%
|
|
\def\pgfmath@zeros{}%
|
|
\def\pgfmath@targetiterations{1}%
|
|
\else%
|
|
\ifdim\pgfmath@x<1000pt\relax%
|
|
\def\pgfmath@zeros{0}%
|
|
\def\pgfmath@targetiterations{2}%
|
|
\else%
|
|
\ifdim\pgfmath@x<10000pt\relax%
|
|
\def\pgfmath@zeros{}%
|
|
\def\pgfmath@targetiterations{2}%
|
|
\else%
|
|
\def\pgfmath@zeros{0}%
|
|
\def\pgfmath@targetiterations{3}%
|
|
\fi\fi\fi\fi\fi%
|
|
\edef\pgfmath@temp{\pgfmath@zeros\pgfmath@tonumber{\pgfmath@x}}%
|
|
\expandafter\pgfmath@sqrt@\pgfmath@temp\pgfmath@%
|
|
}
|
|
\def\pgfmath@sqrt@#1.#2\pgfmath@{\pgfmath@@sqrt@#1#2\pgfmath@empty\pgfmath@empty\pgfmath@}
|
|
|
|
\def\pgfmath@@sqrt@#1#2{%
|
|
\c@pgfmath@countb=#1#2\relax%
|
|
\ifnum\c@pgfmath@countb>35\relax%
|
|
\ifnum\c@pgfmath@countb>63\relax%
|
|
\ifnum\c@pgfmath@countb>80\relax%
|
|
\c@pgfmath@counta=9\relax%
|
|
\else%
|
|
\c@pgfmath@counta=8\relax%
|
|
\fi%
|
|
\else%
|
|
\ifnum\c@pgfmath@countb>48\relax%
|
|
\c@pgfmath@counta=7\relax%
|
|
\else%
|
|
\c@pgfmath@counta=6\relax%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\ifnum\c@pgfmath@countb>15\relax%
|
|
\ifnum\c@pgfmath@countb>24\relax%
|
|
\c@pgfmath@counta5\relax%
|
|
\else%
|
|
\c@pgfmath@counta=4\relax%
|
|
\fi%
|
|
\else%
|
|
\ifnum\c@pgfmath@countb>3\relax%
|
|
\ifnum\c@pgfmath@countb>8\relax%
|
|
\c@pgfmath@counta=3\relax%
|
|
\else%
|
|
\c@pgfmath@counta=2\relax%
|
|
\fi%
|
|
\else%
|
|
\ifnum\c@pgfmath@countb>0\relax%
|
|
\c@pgfmath@counta=1\relax%
|
|
\else%
|
|
\c@pgfmath@counta=0\relax%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\edef\pgfmath@root{\the\c@pgfmath@counta}%
|
|
\edef\pgfmath@rootspecial{\the\c@pgfmath@counta}%
|
|
\multiply\c@pgfmath@counta by-\c@pgfmath@counta\relax%
|
|
\advance\c@pgfmath@counta by#1#2\relax%
|
|
\edef\pgfmath@remainder{\the\c@pgfmath@counta}%
|
|
\pgfmath@@@sqrt@%
|
|
}
|
|
|
|
\def\pgfmath@@@sqrt@#1#2{%
|
|
\ifx\pgfmath@empty#1%
|
|
\edef\pgfmath@remainder{\pgfmath@remainder00}%
|
|
\def\pgfmath@tokens{\pgfmath@empty\pgfmath@empty}%
|
|
\else%
|
|
\ifx\pgfmath@empty#2%
|
|
\edef\pgfmath@remainder{\pgfmath@remainder#10}%
|
|
\def\pgfmath@tokens{\pgfmath@empty\pgfmath@empty}%
|
|
\else%
|
|
\edef\pgfmath@remainder{\pgfmath@remainder#1#2}%
|
|
\def\pgfmath@tokens{}%
|
|
\fi\fi%
|
|
\c@pgfmath@counta=\pgfmath@rootspecial\relax%
|
|
\multiply\c@pgfmath@counta by20\relax%
|
|
\c@pgfmath@countb=\c@pgfmath@counta%
|
|
\multiply\c@pgfmath@countb by6\relax%
|
|
\advance\c@pgfmath@countb by36\relax%
|
|
\c@pgfmath@countc=\c@pgfmath@counta%
|
|
\multiply\c@pgfmath@countc by2\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\advance\c@pgfmath@countb by-\c@pgfmath@countc%
|
|
\advance\c@pgfmath@countb by-20\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\advance\c@pgfmath@countb by-\c@pgfmath@countc%
|
|
\advance\c@pgfmath@countb by-12\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\advance\c@pgfmath@countb by-\c@pgfmath@counta%
|
|
\advance\c@pgfmath@countb by-3\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\def\pgfmath@digit{0}%
|
|
\else%
|
|
\def\pgfmath@digit{1}%
|
|
\fi%
|
|
\else%
|
|
\advance\c@pgfmath@countb by\c@pgfmath@counta%
|
|
\advance\c@pgfmath@countb by5\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\def\pgfmath@digit{2}%
|
|
\else%
|
|
\def\pgfmath@digit{3}%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\advance\c@pgfmath@countb by\c@pgfmath@counta%
|
|
\advance\c@pgfmath@countb by9\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\def\pgfmath@digit{4}%
|
|
\else%
|
|
\def\pgfmath@digit{5}%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\advance\c@pgfmath@countb by\c@pgfmath@countc%
|
|
\advance\c@pgfmath@countb by28\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\advance\c@pgfmath@countb by-\c@pgfmath@counta%
|
|
\advance\c@pgfmath@countb by-15\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\def\pgfmath@digit{6}%
|
|
\else%
|
|
\def\pgfmath@digit{7}%
|
|
\fi%
|
|
\else%
|
|
\advance\c@pgfmath@countb by\c@pgfmath@counta%
|
|
\advance\c@pgfmath@countb by17\relax%
|
|
\ifnum\c@pgfmath@countb>\pgfmath@remainder\relax%
|
|
\def\pgfmath@digit{8}%
|
|
\else%
|
|
\def\pgfmath@digit{9}%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\edef\pgfmath@rootspecial{\pgfmath@rootspecial\pgfmath@digit}%
|
|
\advance\c@pgfmath@counta by\pgfmath@digit\relax%
|
|
\multiply\c@pgfmath@counta by-\pgfmath@digit\relax%
|
|
\advance\c@pgfmath@counta by\pgfmath@remainder\relax%
|
|
\edef\pgfmath@remainder{\the\c@pgfmath@counta}%
|
|
\c@pgfmath@counta=\pgfmath@targetiterations\relax%
|
|
\advance\c@pgfmath@counta by-1\relax%
|
|
\edef\pgfmath@targetiterations{\the\c@pgfmath@counta}%
|
|
\ifnum\c@pgfmath@counta=0\relax%
|
|
\edef\pgfmath@root{\pgfmath@root.\pgfmath@digit}%
|
|
\else%
|
|
\edef\pgfmath@root{\pgfmath@root\pgfmath@digit}%
|
|
\fi%
|
|
\ifnum\c@pgfmath@counta=-4\relax% -n+1 digits of precision.
|
|
\let\pgfmath@next\pgfmath@sqrt@end%
|
|
\else%
|
|
\let\pgfmath@next\pgfmath@@@sqrt@%
|
|
\fi%
|
|
\expandafter\pgfmath@next\pgfmath@tokens%
|
|
}
|
|
|
|
\def\pgfmath@sqrt@end#1\pgfmath@{%
|
|
\edef\pgfmathresult{\pgfmath@root}%
|
|
\pgfmath@smuggleone\pgfmathresult%
|
|
\endgroup}
|
|
|
|
% \pgfmathpow
|
|
%
|
|
% Calculates #1 ^ #2
|
|
%
|
|
\pgfmathdeclarefunction{pow}{2}{%
|
|
\begingroup%
|
|
\pgfmath@xa=#1pt%
|
|
\pgfmath@xb=#2pt%
|
|
\ifdim\pgfmath@xa=0pt\relax%
|
|
\ifdim\pgfmath@xb=0pt\relax%
|
|
\pgfmath@x=1pt\relax%
|
|
\else%
|
|
\pgfmath@x=0pt\relax%
|
|
\fi%
|
|
\else%
|
|
\afterassignment\pgfmath@x%
|
|
\expandafter\c@pgfmath@counta\the\pgfmath@xb\relax%
|
|
\ifnum\c@pgfmath@counta<0\relax%
|
|
\c@pgfmath@counta=-\c@pgfmath@counta%
|
|
\pgfmathreciprocal@{#1}%
|
|
\pgfmath@xa=\pgfmathresult pt\relax%
|
|
\fi
|
|
\ifdim\pgfmath@x=0pt\relax%
|
|
\pgfmath@x=1pt\relax%
|
|
\pgfmathloop%
|
|
\ifnum\c@pgfmath@counta>0\relax%
|
|
\ifodd\c@pgfmath@counta%
|
|
\pgfmath@x=\pgfmath@tonumber{\pgfmath@x}\pgfmath@xa%
|
|
\fi
|
|
\ifnum\c@pgfmath@counta>1\relax%
|
|
\pgfmath@xa=\pgfmath@tonumber{\pgfmath@xa}\pgfmath@xa%
|
|
\fi%
|
|
\divide\c@pgfmath@counta by2\relax%
|
|
\repeatpgfmathloop%
|
|
\else%
|
|
\pgfmathln@{#1}%
|
|
\pgfmath@x=\pgfmathresult pt\relax%
|
|
\pgfmath@x=\pgfmath@tonumber{\pgfmath@xb}\pgfmath@x%
|
|
\pgfmathexp@{\pgfmath@tonumber{\pgfmath@x}}%
|
|
\pgfmath@x=\pgfmathresult pt\relax%
|
|
\fi%
|
|
\fi
|
|
\pgfmath@returnone\pgf@x%
|
|
\endgroup%
|
|
}
|
|
|
|
% factorial function.
|
|
%
|
|
\pgfmathdeclarefunction{factorial}{1}{%
|
|
\begingroup%
|
|
\afterassignment\pgfmath@gobbletilpgfmath@%
|
|
\c@pgfmath@counta=#1\relax\pgfmath@%
|
|
\pgfmath@x=1pt\relax%
|
|
\pgfmathloop%
|
|
\ifnum\c@pgfmath@counta<2\relax%
|
|
\else%
|
|
\multiply\pgfmath@x by\c@pgfmath@counta%
|
|
\advance\c@pgfmath@counta by-1\relax%
|
|
\repeatpgfmathloop%
|
|
\edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}%
|
|
\pgfmath@smuggleone\pgfmathresult%
|
|
\endgroup%
|
|
}
|
|
|
|
% Local Variables:
|
|
% coding: undecided-unix
|
|
% End:
|
|
|