\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{fp-snap}[1995/04/05] %version information \def\FP@snapversion{1.0a} \message{% `Fixed Point Snap Off',% \space\space\space\space\space\space\space\space\space\space% Version \FP@snapversion% \space(C) Michael Mehlich% \space\space\space\space\space\space\space% \space\space\space\space\space\space% } %resolve dependencies \RequirePackage{fp-basic} %%%public area (macros which may be used)%%% \def\FPround#1#2#3{\FP@calld\FP@round#1{#2}{#3}} \def\FPtrunc#1#2#3{\FP@calld\FP@trunc#1{#2}{#3}} \def\FPclip#1#2{\FP@calld\FP@clip#1{#2}} %%%private fp-area (don't use these macros)%%% %round value \def\FP@round#1#2.#3.#4\relax#5{% % #1 macro, which gets the result % #2 integer part of value % #3 fractional part of value % #4 dummy to swallow everything after the second '.' % #5 round position {\FP@beginmessage{ROUND}% % \FP@count=#5\relax% % \ifnum\FP@count<0\relax% \FP@errmessage{Rounding value before point not allowed}% \else% \FP@readvalue{x}{#2}{#3}% \ifnum\FP@count=0\relax% \ifnum\FP@xfa<500000000\relax% \edef\FP@tmp{#2}% \else% \advance\FP@xib1\relax% \ifnum\FP@xib<1000000000\relax\else% \advance\FP@xia1\relax% \advance\FP@xib-1000000000\relax% \fi% \ifnum\FP@xs<0\relax% \edef\FP@tmp{-}% \else% \edef\FP@tmp{}% \fi% \ifnum\FP@xia=0\relax% \edef\FP@tmp{\FP@tmp\the\FP@xib}% \else% \advance\FP@xib1000000000\relax% \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib}% \fi% \fi% \else% \ifnum\FP@count>18\relax% \FP@count=18\relax% \fi% \advance\FP@xfa1000000000\relax% \advance\FP@xfb1000000000\relax% \edef\FP@tmp{\expandafter\FP@ignorenext\the\FP@xfa\expandafter\FP@ignorenext\the\FP@xfb}% \edef\FP@rd{}% \FP@shift=\FP@count% \FP@times=1\relax% \loop% \ifnum\FP@count>0\relax% \edef\FP@rd{\FP@rd\expandafter\FP@first\FP@tmp\noexpand\relax}% \edef\FP@tmp{\expandafter\FP@ignorenext\FP@tmp}% \advance\FP@count-1\relax% \multiply\FP@times10\relax\ifnum\FP@times=1000000000\relax\FP@times=1\relax\fi% \repeat% \edef\FP@tmp{\expandafter\FP@first\FP@tmp\noexpand\relax}% \expandafter\FP@rega\FP@tmp\relax% \ifnum\FP@rega>4\relax% \ifnum\FP@shift>8\relax% \FP@ninesplit\FP@rd% \expandafter\FP@rega\expandafter0\FP@rd\relax% \advance\FP@rega1\relax% \ifnum\FP@rega<\FP@times% \advance\FP@rega\FP@times% \advance\FP@res1000000000\relax% \else% \advance\FP@res1\relax% \ifnum\FP@res<1000000000\relax% \advance\FP@res1000000000\relax% \else% \advance\FP@xib1\relax% \ifnum\FP@xib<1000000000\relax\else% \advance\FP@xia1\relax% \advance\FP@xib-1000000000\relax% \fi% \fi% \fi% \edef\FP@tmpa{\expandafter\FP@ignorenext\the\FP@res\expandafter\FP@ignorenext\the\FP@rega}% \else% \expandafter\FP@rega\FP@rd\relax% \advance\FP@rega1\relax% \ifnum\FP@rega<\FP@times% \advance\FP@rega\FP@times% \else% \advance\FP@xib1\relax% \ifnum\FP@xib<1000000000\relax\else% \advance\FP@xia1\relax% \advance\FP@xib-1000000000\relax% \fi% \fi% \edef\FP@tmpa{\expandafter\FP@ignorenext\the\FP@rega}% \fi% \else% \edef\FP@tmpa{\FP@rd}% \fi% \ifnum\FP@xs<0\relax% \edef\FP@tmp{-}% \else% \edef\FP@tmp{}% \fi% \ifnum\FP@xia=0\relax% \edef\FP@tmp{\FP@tmp\the\FP@xib.\FP@tmpa}% \else% \advance\FP@xib1000000000\relax% \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib.\FP@tmpa}% \fi% \fi% \fi% % \global\let\FP@tmp\FP@tmp% % \FP@endmessage{}% }% \let#1\FP@tmp% } %trunc value \def\FP@trunc#1#2.#3.#4\relax#5{% % #1 macro, which gets the result % #2 integer part of value % #3 fractional part of value % #4 dummy to swallow everything after the second '.' % #5 trunc position {\FP@beginmessage{TRUNC}% % \FP@count=#5\relax% % \ifnum\FP@count<0\relax% \FP@errmessage{Truncating value before point not allowed}% \else\ifnum\FP@count=0\relax% \edef\FP@tmp{#2}% \else% \ifnum\FP@count>18\relax% \FP@count=18\relax% \fi% \FP@readvalue{x}{#2}{#3}% \advance\FP@xfa1000000000\relax% \advance\FP@xfb1000000000\relax% \edef\FP@tmp{\expandafter\FP@ignorenext\the\FP@xfa\expandafter\FP@ignorenext\the\FP@xfb}% \edef\FP@tmpa{}% \loop% \ifnum\FP@count>0\relax% \edef\FP@tmpa{\FP@tmpa\expandafter\FP@first\FP@tmp\noexpand\relax}% \edef\FP@tmp{\expandafter\FP@ignorenext\FP@tmp}% \advance\FP@count-1\relax% \repeat% \ifnum\FP@xs<0\relax% \edef\FP@tmp{-}% \else% \edef\FP@tmp{}% \fi% \ifnum\FP@xia=0\relax% \edef\FP@tmp{\FP@tmp\the\FP@xib.\FP@tmpa}% \else% \advance\FP@xib1000000000\relax% \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib.\FP@tmpa}% \fi% \fi\fi% % \global\let\FP@tmp\FP@tmp% % \FP@endmessage{}% }% \let#1\FP@tmp% } %clip value \def\FP@revert#1#2{% % #1 macro, which gets the result % #2 value {\edef\FP@tmpa{#2}% \edef\FP@tmp{}% \loop% \expandafter\if!\FP@tmpa!\relax\else% \edef\FP@tmpb{\expandafter\FP@first\FP@tmpa\noexpand\relax}% \edef\FP@tmpa{\expandafter\FP@ignorenext\FP@tmpa}% \edef\FP@tmp{\FP@tmpb\FP@tmp}% \repeat% \global\let\FP@tmp\FP@tmp% }% \let#1\FP@tmp% } \def\FP@clip#1#2.#3.#4\relax{% % #1 macro, which gets the result % #2 integer part of value % #3 fractional part of value % #4 dummy to swallow everthing after the 2nd '.' % {\FP@beginmessage{CLIP}% % \FP@revert\FP@tmpb{#3}% \FP@removeleadingzeros\FP@tmpb\relax% \FP@revert\FP@tmpb\FP@tmp% \edef\FP@tmpa{#2}% \FP@removeleadingzeros\FP@tmpa\relax% \edef\FP@tmpa{\FP@tmp}% \expandafter\if!\FP@tmpa!\relax% \expandafter\if!\FP@tmpb!\relax% \edef\FP@tmp{0}% \else% \edef\FP@tmp{0.\FP@tmpb}% \fi% \else% \expandafter\if!\FP@tmpb!\relax% \edef\FP@tmp{\FP@tmpa}% \else% \edef\FP@tmp{\FP@tmpa.\FP@tmpb}% \fi% \fi% % \global\let\FP@tmp\FP@tmp% % \FP@endmessage{}% }% \let#1\FP@tmp% }