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.
242 lines
6.4 KiB
242 lines
6.4 KiB
\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%
|
|
}
|
|
|