% Copyright 2018 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. \pgfkeys{/pgf/.cd, fixed point arithmetic/.code={% \pgfmathfp@plots@install% \pgfmathfp@parser@install% \let\pgfmathparse=\pgfmathfpparse% \pgfkeys{/pgf/fixed point/.cd, #1}% },% fixed point/.cd, scale results/.code={% \pgfmathfpparse{#1}% \let\pgfmathfpscale=\pgfmathresult% }% }% \def\pgfmathfpscale{1}% \def\pgfmathfpparse{% \begingroup% \let\pgfmathpostparse=\relax% \pgfmath@catcodes% \pgfmath@quickparsefalse% \pgfmathfpparse@}% \def\pgfmathfpparse@#1{% \edef\pgfmathfp@expression{#1}% \expandafter\pgfmathfpparse@@\pgfmathfp@expression\pgfmathfp@}% \def\pgfmathfp@char@asterisk{*}% \def\pgfmathfpparse@@#1#2\pgfmathfp@{% \def\pgfmathfp@test{#1}% \ifx\pgfmathfp@test\pgfmathfp@char@asterisk% \edef\pgfmathfp@expression{\pgfmathfpscale#1#2}% \else% \edef\pgfmathfp@expression{#1#2}% \fi% \expandafter\pgfmathparse@\expandafter{\pgfmathfp@expression}% % \endgroup provided by \pgfpathmarse@end }% % Crude handling of file plots % \pgfkeys{/pgf/fixed point/.cd, scale file plot x/.code=\pgfmathfpparse{#1}\edef\pgfmathfpplotscalex{\pgfmathresult*}, scale file plot y/.code=\pgfmathfpparse{#1}\edef\pgfmathfpplotscaley{\pgfmathresult*}, scale file plot z/.code=\pgfmathfpparse{#1}\edef\pgfmathfpplotscalez{\pgfmathresult*}, }% \def\pgfmathfp@plots@install{% \let\pgfmathfpplotscalex=\pgfutil@empty \let\pgfmathfpplotscaley=\pgfutil@empty \let\pgfmathfpplotscalez=\pgfutil@empty \let\pgf@parsexyline=\pgfmathfp@parsexyline% \let\pgf@parsexyzline=\pgfmathfp@parsexyzline% }% \def\pgfmathfp@parsexyline#1 #2 #3\pgf@stop{% \edef\pgfmathfp@marshal{% \noexpand\pgfplotstreampoint{\noexpand\pgfpointxy{\pgfmathfpplotscalex#1}{\pgfmathfpplotscaley#2}}% }% \pgfmathfp@marshal% }% \def\pgfmathfp@parsexyzline#1 #2 #3 #4\pgf@stop{% \edef\pgfmathfp@marshal{% \noexpand\pgfplotstreampoint{% \noexpand\pgfpointxyz{\pgfmathfpplotscalex#1}{\pgfmathfpplotscaley#2}{\pgfmathfpplotscalez#3}% }% }% \pgfmathfp@marshal% }% % \def\pgfmathfp@parser@install{% % \expandafter\ifx\csname FP@version\endcsname\relax% \pgferror{You need to say `\string\usepackage{fp}' to use % fixed point arithmetic}% \else% % % Don't want messages. % \FPmessagesfalse% \FPdebugfalse% % % Install float commands... % \let\pgfmathadd@=\pgfmathfpadd@% \let\pgfmathsubtract@=\pgfmathfpsubtract@% \let\pgfmathmultiply@=\pgfmathfpmultiply@% \let\pgfmathdivide@=\pgfmathfpdivide@% \let\pgfmathabs@=\pgfmathfpabs@% \let\pgfmathneg@=\pgfmathfpneg@% \let\pgfmathround@=\pgfmathfpround@% \let\pgfmathfloor@=\pgfmathfpfloor@% \let\pgfmathceil@=\pgfmathfpceil@% \let\pgfmathmod@=\pgfmathfpmod@% \let\pgfmathmax@=\pgfmathfpmax@% \let\pgfmathmin@=\pgfmathfpmin@% \let\pgfmathsin@=\pgfmathfpsin@% \let\pgfmathcos@=\pgfmathfpcos@% \let\pgfmathtan@=\pgfmathfptan@% \let\pgfmathdeg@=\pgfmathfpdeg@% \let\pgfmathrad@=\pgfmathfprad@% \let\pgfmathatan@=\pgfmathfpatan@% \let\pgfmathasin@=\pgfmathfpasin@% \let\pgfmathacos@=\pgfmathfpacos@% \let\pgfmathcot@=\pgfmathfpcot@% \let\pgfmathsec@=\pgfmathfpsec@% \let\pgfmathcosec@=\pgfmathfpcosec@% \let\pgfmathpow@=\pgfmathfppow@% \let\pgfmathexp@=\pgfmathfpexp@% \let\pgfmathln@=\pgfmathfpln@% \let\pgfmathsqrt@=\pgfmathfpsqrt@% \let\pgfmath@pi=\pgfmathfppi@% \let\pgfmathveclen@=\pgfmathfpveclen@% \let\pgfmathe@=\pgfmathfpe@% % \let\pgfmathlessthan@=\pgfmathfplessthan@% \let\pgfmathgreaterthan@=\pgfmathfpgreaterthan@% \let\pgfmathequalto@=\pgfmathfpequalto@% % \let\pgfmathrnd=\pgfmathfprnd% \let\pgfmathrand=\pgfmathfprand% \let\pgfmathsetseed=\pgfmathfpsetseed% % \let\pgfmathscientific=\pgfmathfpscientific% \fi% }% \def\pgfmathfpe@{let\pgfmathresult=\FPe}% \def\pgfmathfppi@{let\pgfmathresult=\FPpi}% % Scientific notation. \def\pgfmathfpscientific#1#2{% \begingroup% \FPpow\pgfmathresult{10}{#2}\unskip% Needed. \FPmul\pgfmathresult{#1}{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % Comparison stuff... % lessthan % \def\pgfmathfplessthan#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfplessthan@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfplessthan@#1#2{% \begingroup% \FPiflt{#1}{#2}% \def\pgfmathresult{1.0}% \else% \def\pgfmathresult{0.0}% \fi% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % greaterthan % \def\pgfmathfpgreaterthan#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpgreaterthan@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpgreaterthan@#1#2{% \begingroup% \FPifgt{#1}{#2}% \def\pgfmathresult{1.0}% \else% \def\pgfmathresult{0.0}% \fi% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % equalto % \def\pgfmathfpequalto#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpequalto@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpequalto@#1#2{% \begingroup% \FPifeq{#1}{#2}% \def\pgfmathresult{1.0}% \else% \def\pgfmathresult{0.0}% \fi% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % Basic arithmetic stuff... % add % \def\pgfmathfpadd#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpadd@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpadd@#1#2{% \begingroup% \FPadd\pgfmathresult{#1}{#2}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % subtract % \def\pgfmathfpsubtract#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpsubtract@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpsubtract@#1#2{% \begingroup% \FPsub\pgfmathresult{#1}{#2}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % multiply % \def\pgfmathfpmultiply#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpmultiply@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpmultiply@#1#2{% \begingroup% \FPmul\pgfmathresult{#1}{#2}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % divide % \def\pgfmathfpdivide#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpdivide@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpdivide@#1#2{% \begingroup% \FPdiv\pgfmathresult{#1}{#2}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % abs % \def\pgfmathfpabs#1{% \pgfmathfpparse{#1}% \pgfmathfpabs@{\pgfmathresult}% }% \def\pgfmathfpabs@#1{% \begingroup% \FPabs\pgfmathresult{#1}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % neg % \def\pgfmathfpneg#1{% \pgfmathfpparse{#1}% \pgfmathfpneg@{\pgfmathresult}% }% \def\pgfmathfpneg@#1{% \begingroup% \FPneg\pgfmathresult{#1}% \pgfmath@smuggleone\pgfmathresult \endgroup% }% % round % \def\pgfmathfpround#1{% \pgfmathfpparse{#1}% \pgfmathfpround@{\pgfmathresult}% }% \def\pgfmathfpround@#1{% \begingroup% \FPround\pgfmathresult{#1}{0}% \edef\pgfmathresult{\pgfmathresult.0}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % floor % \def\pgfmathfpfloor#1{% \pgfmathfpparse{#1}% \pgfmathfpfloor@{\pgfmathresult}% }% \def\pgfmathfpfloor@#1{% \begingroup% \FPtrunc\pgfmathresult{#1}{0}% \FPifneg{#1}% \FPsub\pgfmathresult{\pgfmathresult}{1}% \fi% \edef\pgfmathresult{\pgfmathresult.0}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % ceil % \def\pgfmathfpceil#1{% \pgfmathfpparse{#1}% \pgfmathfpceil@{\pgfmathresult}% }% \def\pgfmathfpceil@#1{% \begingroup% \FPtrunc\pgfmathresult{#1}{0}% \FPifpos{#1}% \FPadd\pgfmathresult{\pgfmathresult}{1}% \fi% \edef\pgfmathresult{\pgfmathresult.0}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % mod % \def\pgfmathfpmod#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpmod@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpmod@#1#2{% \begingroup% \FPdiv\pgfmathresult{#1}{#2}% \FPtrunc\pgfmathresult{\pgfmathresult}{0}% \FPmul\pgfmathresult{\pgfmathresult}{#2}% \FPsub\pgfmathresult{#1}{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % max % \def\pgfmathfpmax#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpmax@@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpmax@#1{% \pgfmathfpmax@@#1% }% \def\pgfmathfpmax@@#1#2{% \begingroup% \FPifgt{#1}{#2}% \def\pgfmathresult{#1}% \else% \def\pgfmathresult{#2}% \fi% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % min % \def\pgfmathfpmin#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpmin@@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpmin@#1{% \pgfmathfpmin@@#1% }% \def\pgfmathfpmin@@#1#2{% \begingroup% \FPiflt{#1}{#2}% \def\pgfmathresult{#1}% \else% \def\pgfmathresult{#2}% \fi% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % Functions... % pow % \def\pgfmathfppow#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfppow@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfppow@#1#2{% \begingroup% \FPpow\pgfmathresult{#1}{#2}\unskip% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % exp % \def\pgfmathfpexp#1{% \pgfmathfpparse{#1}% \pgfmathfpexp@{\pgfmathresult}% }% \def\pgfmathfpexp@#1{% \begingroup% \FPexp\pgfmathresult{#1}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % ln % \def\pgfmathfpln#1{% \pgfmathfpparse{#1}% \pgfmathfpln@{\pgfmathresult}% }% \def\pgfmathfpln@#1{% \begingroup% \FPln\pgfmathresult{#1}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % sqrt % \def\pgfmathfpsqrt#1{% \pgfmathfpparse{#1}% \pgfmathfpsqrt@{\pgfmathresult}% }% \def\pgfmathfpsqrt@#1{% \begingroup% \FProot\pgfmathresult{#1}{2}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % veclen % \def\pgfmathfpveclen#1#2{% \pgfmathfpparse{#2}\let\pgfmath@result=\pgfmathresult% \pgfmathfpparse{#1}% \pgfmathfpveclen@{\pgfmathresult}{\pgfmath@result}% }% \def\pgfmathfpveclen@#1#2{% \begingroup% \FPmul\pgfmath@result{#1}{#1}% \FPmul\pgfmath@@result{#2}{#2}% \FPadd\pgfmathresult{\pgfmath@result}{\pgfmath@@result}% \FProot\pgfmathresult{\pgfmathresult}{2}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % Trigonometric stuff... % sin % \def\pgfmathfpsin#1{% \pgfmathfpparse{#1}% \pgfmathfpsin@{\pgfmathresult}% }% \def\pgfmathfpsin@#1{% \begingroup% \FPmul\pgfmathresult{#1}{0.017453292519943295}% \FPsin\pgfmathresult{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % cos % \def\pgfmathfpcos#1{% \pgfmathfpparse{#1}% \pgfmathfpcos@{\pgfmathresult}% }% \def\pgfmathfpcos@#1{% \begingroup% \FPmul\pgfmathresult{#1}{0.017453292519943295}% \FPcos\pgfmathresult{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % tan % \def\pgfmathfptan#1{% \pgfmathfpparse{#1}% \pgfmathfptan@{\pgfmathresult}% }% \def\pgfmathfptan@#1{% \begingroup% \FPmul\pgfmathresult{#1}{0.017453292519943295}% \FPtan\pgfmathresult{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % acos % \def\pgfmathfpacos#1{% \pgfmathfpparse{#1}% \pgfmathfpacos@{\pgfmathresult}% }% \def\pgfmathfpacos@#1{% \begingroup% \FParccos\pgfmathresult{#1}% \FPmul\pgfmathresult{\pgfmathresult}{57.295779513082320885}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % asin % \def\pgfmathfpasin#1{% \pgfmathfpparse{#1}% \pgfmathfpasin@{\pgfmathresult}% }% \def\pgfmathfpasin@#1{% \begingroup% \FParcsin\pgfmathresult{#1}% \FPmul\pgfmathresult{\pgfmathresult}{57.295779513082320885}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % atan % \def\pgfmathfpatan#1{% \pgfmathfpparse{#1}% \pgfmathfpatan@{\pgfmathresult}% }% \def\pgfmathfpatan@#1{% \begingroup% \FParctan\pgfmathresult{#1}% \FPmul\pgfmathresult{\pgfmathresult}{57.295779513082320885}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % cot % \def\pgfmathfpcot#1{% \pgfmathfpparse{#1}% \pgfmathfpcot@{\pgfmathresult}% }% \def\pgfmathfpcot@#1{% \begingroup% \FPmul\pgfmathresult{#1}{0.017453292519943295}% \FPcot\pgfmathresult{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % sec % \def\pgfmathfpsec#1{% \pgfmathfpparse{#1}% \pgfmathfpsec@{\pgfmathresult}% }% \def\pgfmathfpsec@#1{% \begingroup% \FPmul\pgfmathresult{#1}{0.017453292519943295}% \FPcos\pgfmathresult{\pgfmathresult}% \FPdiv\pgfmathresult{1}{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % cosec % \def\pgfmathfpcosec#1{% \pgfmathfpparse{#1}% \pgfmathfpcosec@{\pgfmathresult}% }% \def\pgfmathfpcosec@#1{% \begingroup% \FPmul\pgfmathresult{#1}{0.017453292519943295}% \FPsin\pgfmathresult{\pgfmathresult}% \FPdiv\pgfmathresult{1}{\pgfmathresult}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % deg % \def\pgfmathfpdeg#1{% \pgfmathfpparse{#1}% \pgfmathfpdeg@{\pgfmathresult}% }% \def\pgfmathfpdeg@#1{% \begingroup% \FPmul\pgfmathresult{#1}{57.295779513082320885}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % rad % \def\pgfmathfprad#1{% \pgfmathfpparse{#1}% \pgfmathfprad@{\pgfmathresult}% }% \def\pgfmathfprad@#1{% \begingroup% \FPmul\pgfmathresult{#1}{0.01745329251994325}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % Random stuff... \def\pgfmathfpsetseed#1{% \pgfmathfpparse{#1}% \afterassignment\pgfmath@gobbletilpgfmath@% \FPseed\pgfmathresult\relax\pgfmath@% }% % rnd % \def\pgfmathfprnd{% \begingroup% \FPrandom\pgfmathresult% \pgfmath@smuggleone\pgfmathresult% \endgroup% }% % rand % \def\pgfmathfprand{% \begingroup% \FPrandom\pgfmathresult% \FPmul\pgfmathresult{2}{\pgfmathresult}% \FPsub\pgfmathresult{\pgfmathresult}{1}% \pgfmath@smuggleone\pgfmathresult% \endgroup% }%