% Copyright 2019 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: