home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / inputs / latex / contrib / other / fp.lha / fp / fp-snap.sty < prev    next >
Text File  |  1995-04-05  |  7KB  |  243 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-snap}[1995/04/05]
  3.  
  4. %version information
  5. \def\FP@snapversion{1.0a}
  6. \message{%
  7.   `Fixed Point Snap Off',%
  8.   \space\space\space\space\space\space\space\space\space\space%
  9.   Version \FP@snapversion%
  10.   \space(C) Michael Mehlich%
  11.   \space\space\space\space\space\space\space%
  12.   \space\space\space\space\space\space%
  13. }
  14.  
  15. %resolve dependencies
  16. \RequirePackage{fp-basic}
  17.  
  18. %%%public area (macros which may be used)%%%
  19.  
  20. \def\FPround#1#2#3{\FP@calld\FP@round#1{#2}{#3}}
  21. \def\FPtrunc#1#2#3{\FP@calld\FP@trunc#1{#2}{#3}}
  22. \def\FPclip#1#2{\FP@calld\FP@clip#1{#2}}
  23.  
  24. %%%private fp-area (don't use these macros)%%%
  25.  
  26. %round value
  27. \def\FP@round#1#2.#3.#4\relax#5{%
  28.   % #1 macro, which gets the result
  29.   % #2 integer part of value
  30.   % #3 fractional part of value
  31.   % #4 dummy to swallow everything after the second '.'
  32.   % #5 round position
  33.   {\FP@beginmessage{ROUND}%
  34.    %
  35.    \FP@count=#5\relax%
  36.    %
  37.    \ifnum\FP@count<0\relax%
  38.      \FP@errmessage{Rounding value before point not allowed}%
  39.    \else
  40.      \FP@readvalue{x}{#2}{#3}%
  41.      \ifnum\FP@count=0\relax%
  42.         \ifnum\FP@xfa<500000000\relax%
  43.       \edef\FP@tmp{#2}%
  44.     \else%
  45.       \advance\FP@xib1\relax%
  46.       \ifnum\FP@xib<1000000000\relax\else%
  47.         \advance\FP@xia1\relax%
  48.         \advance\FP@xib-1000000000\relax%
  49.       \fi%
  50.       \ifnum\FP@xs<0\relax%
  51.         \edef\FP@tmp{-}%
  52.       \else%
  53.         \edef\FP@tmp{}%
  54.       \fi%
  55.       \ifnum\FP@xia=0\relax%
  56.         \edef\FP@tmp{\FP@tmp\the\FP@xib}%
  57.       \else%
  58.         \advance\FP@xib1000000000\relax%
  59.         \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib}%
  60.       \fi%
  61.     \fi%
  62.      \else%
  63.        \ifnum\FP@count>18\relax%
  64.          \FP@count=18\relax%
  65.        \fi%
  66.        \advance\FP@xfa1000000000\relax%
  67.        \advance\FP@xfb1000000000\relax%
  68.        \edef\FP@tmp{\expandafter\FP@ignorenext\the\FP@xfa\expandafter\FP@ignorenext\the\FP@xfb}%
  69.        \edef\FP@rd{}%
  70.        \FP@shift=\FP@count%
  71.        \FP@times=1\relax%
  72.        \loop%
  73.           \ifnum\FP@count>0\relax%
  74.              \edef\FP@rd{\FP@rd\expandafter\FP@first\FP@tmp\noexpand\relax}%
  75.              \edef\FP@tmp{\expandafter\FP@ignorenext\FP@tmp}%
  76.          \advance\FP@count-1\relax%
  77.          \multiply\FP@times10\relax\ifnum\FP@times=1000000000\relax\FP@times=1\relax\fi%
  78.           \repeat%
  79.        \edef\FP@tmp{\expandafter\FP@first\FP@tmp\noexpand\relax}%
  80.        \expandafter\FP@rega\FP@tmp\relax%
  81.        \ifnum\FP@rega>4\relax%
  82.      \ifnum\FP@shift>8\relax%
  83.        \FP@ninesplit\FP@rd%
  84.        \expandafter\FP@rega\expandafter0\FP@rd\relax%
  85.        \advance\FP@rega1\relax%
  86.        \ifnum\FP@rega<\FP@times%
  87.          \advance\FP@rega\FP@times%
  88.          \advance\FP@res1000000000\relax%
  89.        \else%
  90.          \advance\FP@res1\relax%
  91.          \ifnum\FP@res<1000000000\relax%
  92.            \advance\FP@res1000000000\relax%
  93.          \else%
  94.            \advance\FP@xib1\relax%
  95.            \ifnum\FP@xib<1000000000\relax\else%
  96.              \advance\FP@xia1\relax%
  97.              \advance\FP@xib-1000000000\relax%
  98.            \fi%
  99.          \fi%
  100.        \fi%
  101.        \edef\FP@tmpa{\expandafter\FP@ignorenext\the\FP@res\expandafter\FP@ignorenext\the\FP@rega}%
  102.      \else%
  103.        \expandafter\FP@rega\FP@rd\relax%
  104.        \advance\FP@rega1\relax%
  105.        \ifnum\FP@rega<\FP@times%
  106.          \advance\FP@rega\FP@times%
  107.        \else%
  108.          \advance\FP@xib1\relax%
  109.          \ifnum\FP@xib<1000000000\relax\else%
  110.            \advance\FP@xia1\relax%
  111.            \advance\FP@xib-1000000000\relax%
  112.          \fi%
  113.        \fi%
  114.            \edef\FP@tmpa{\expandafter\FP@ignorenext\the\FP@rega}%
  115.      \fi%
  116.        \else%
  117.          \edef\FP@tmpa{\FP@rd}%
  118.        \fi%
  119.        \ifnum\FP@xs<0\relax%
  120.          \edef\FP@tmp{-}%
  121.        \else%
  122.          \edef\FP@tmp{}%
  123.        \fi%
  124.        \ifnum\FP@xia=0\relax%
  125.          \edef\FP@tmp{\FP@tmp\the\FP@xib.\FP@tmpa}%
  126.        \else%
  127.          \advance\FP@xib1000000000\relax%
  128.          \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib.\FP@tmpa}%
  129.        \fi%
  130.      \fi%
  131.    \fi%
  132.    %
  133.    \global\let\FP@tmp\FP@tmp%
  134.    %
  135.    \FP@endmessage{}%
  136.   }%
  137.   \let#1\FP@tmp%
  138. }
  139.  
  140. %trunc value
  141.  
  142. \def\FP@trunc#1#2.#3.#4\relax#5{%
  143.   % #1 macro, which gets the result
  144.   % #2 integer part of value
  145.   % #3 fractional part of value
  146.   % #4 dummy to swallow everything after the second '.'
  147.   % #5 trunc position
  148.   {\FP@beginmessage{TRUNC}%
  149.    %
  150.    \FP@count=#5\relax%
  151.    %
  152.    \ifnum\FP@count<0\relax%
  153.      \FP@errmessage{Truncating value before point not allowed}%
  154.    \else\ifnum\FP@count=0\relax%
  155.      \edef\FP@tmp{#2}%
  156.    \else
  157.      \ifnum\FP@count>18\relax%
  158.        \FP@count=18\relax%
  159.      \fi%
  160.      \FP@readvalue{x}{#2}{#3}%
  161.      \advance\FP@xfa1000000000\relax%
  162.      \advance\FP@xfb1000000000\relax%
  163.      \edef\FP@tmp{\expandafter\FP@ignorenext\the\FP@xfa\expandafter\FP@ignorenext\the\FP@xfb}%
  164.      \edef\FP@tmpa{}%
  165.      \loop%
  166.        \ifnum\FP@count>0\relax%
  167.           \edef\FP@tmpa{\FP@tmpa\expandafter\FP@first\FP@tmp\noexpand\relax}%
  168.           \edef\FP@tmp{\expandafter\FP@ignorenext\FP@tmp}%
  169.       \advance\FP@count-1\relax%
  170.        \repeat%
  171.      \ifnum\FP@xs<0\relax%
  172.        \edef\FP@tmp{-}%
  173.      \else%
  174.        \edef\FP@tmp{}%
  175.      \fi%
  176.      \ifnum\FP@xia=0\relax%
  177.        \edef\FP@tmp{\FP@tmp\the\FP@xib.\FP@tmpa}%
  178.      \else%
  179.        \advance\FP@xib1000000000\relax%
  180.        \edef\FP@tmp{\FP@tmp\the\FP@xia\expandafter\FP@ignorenext\the\FP@xib.\FP@tmpa}%
  181.      \fi%
  182.    \fi\fi%
  183.    %
  184.    \global\let\FP@tmp\FP@tmp%
  185.    %
  186.    \FP@endmessage{}%
  187.   }%
  188.   \let#1\FP@tmp%
  189. }
  190.  
  191. %clip value
  192.  
  193. \def\FP@revert#1#2{%
  194.   % #1 macro, which gets the result
  195.   % #2 value
  196.   {\edef\FP@tmpa{#2}%
  197.    \edef\FP@tmp{}%
  198.    \loop%
  199.      \expandafter\if!\FP@tmpa!\relax\else%
  200.        \edef\FP@tmpb{\expandafter\FP@first\FP@tmpa\noexpand\relax}%
  201.        \edef\FP@tmpa{\expandafter\FP@ignorenext\FP@tmpa}%
  202.        \edef\FP@tmp{\FP@tmpb\FP@tmp}%
  203.      \repeat%
  204.    \global\let\FP@tmp\FP@tmp%
  205.   }%
  206.   \let#1\FP@tmp%
  207. }
  208.  
  209. \def\FP@clip#1#2.#3.#4\relax{%
  210.   % #1 macro, which gets the result
  211.   % #2 integer part of value
  212.   % #3 fractional part of value
  213.   % #4 dummy to swallow everthing after the 2nd '.'
  214.   %
  215.   {\FP@beginmessage{CLIP}%
  216.    %
  217.    \FP@revert\FP@tmpb{#3}%
  218.    \FP@removeleadingzeros\FP@tmpb\relax%
  219.    \FP@revert\FP@tmpb\FP@tmp%
  220.    \edef\FP@tmpa{#2}%
  221.    \FP@removeleadingzeros\FP@tmpa\relax%
  222.    \edef\FP@tmpa{\FP@tmp}%
  223.    \expandafter\if!\FP@tmpa!\relax%
  224.      \expandafter\if!\FP@tmpb!\relax%
  225.        \edef\FP@tmp{0}%
  226.      \else
  227.        \edef\FP@tmp{0.\FP@tmpb}%
  228.      \fi%
  229.    \else%
  230.      \expandafter\if!\FP@tmpb!\relax%
  231.        \edef\FP@tmp{\FP@tmpa}%
  232.      \else%
  233.        \edef\FP@tmp{\FP@tmpa.\FP@tmpb}%
  234.      \fi%
  235.    \fi%
  236.    %
  237.    \global\let\FP@tmp\FP@tmp%
  238.    %
  239.    \FP@endmessage{}%
  240.   }%
  241.   \let#1\FP@tmp%
  242. }
  243.