diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pstricks-add/pst-fp.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pstricks-add/pst-fp.tex | 132 |
1 files changed, 129 insertions, 3 deletions
diff --git a/Master/texmf-dist/tex/generic/pstricks-add/pst-fp.tex b/Master/texmf-dist/tex/generic/pstricks-add/pst-fp.tex index 8cc3d9751f2..ff145b5e251 100644 --- a/Master/texmf-dist/tex/generic/pstricks-add/pst-fp.tex +++ b/Master/texmf-dist/tex/generic/pstricks-add/pst-fp.tex @@ -1,4 +1,4 @@ -%% $Id: pst-fp.tex 112 2009-04-17 19:21:56Z herbert $ +%% $Id: pst-fp.tex 148 2009-11-14 09:01:39Z herbert $ %% %% %% This is file `pst-fp.tex', @@ -23,8 +23,8 @@ % Requires some packages \ifx\PSTricksLoaded\endinput\else\input pstricks \fi % -\def\fileversion{0.02} -\def\filedate{2009/04/02} +\def\fileversion{0.03} +\def\filedate{2009/11/14} \message{`pst-fp' v\fileversion, \filedate\space (hv)} % \edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax @@ -33,6 +33,7 @@ % -999999999999999999.999999999999999999 % and +999999999999999999.999999999999999999 +\def\pstFPmul#1#2#3{\pstFP@callc\pstFP@mul#1{#2}{#3}} % #1 := #2*#3 \def\pstFPdiv#1#2#3{\pstFP@callc\pstFP@div#1{#2}{#3}} % #1 := #2/#3 \countdef\pstFP@actcounter=10 % register 0 for counter @@ -93,6 +94,7 @@ \countdef\pstFP@res=46 \countdef\pstFP@shift=47 \newcount\pstFP@times +\countdef\pstFP@prod=49 %auxiliary macros which may be used in all of the following macros \newif\ifpstFP@test @@ -492,6 +494,130 @@ }% \let#1\pstFP@tmp% } +%multiply two values + +\def\pstFP@firstnine#1#2#3#4#5#6#7#8#9{% + \pstFP@res=#1#2#3#4#5#6#7#8#9\relax% +} +\def\pstFP@@ninesplit#1\relax#2\end#3{% + #1% + \edef#3{#2}% +} +\def\pstFP@ninesplit#1{% + \edef#1{\expandafter\pstFP@firstnine\pstFP@rd}% + \expandafter\pstFP@@ninesplit#1\end#1\relax% +} + +\def\pstFP@split#1#2#3#4{% + % #1 highest three digits + % #2 medium three digits + % #3 least three digits + % #4 counter + \pstFP@regc=#4% + \divide\pstFP@regc1000000\relax% + #1=\pstFP@regc% + \multiply\pstFP@regc-1000000\relax\advance\pstFP@regc#4% + #3=\pstFP@regc% + \divide\pstFP@regc1000\relax% + #2=\pstFP@regc% + \multiply\pstFP@regc-1000\relax\advance\pstFP@regc#3% + #3=\pstFP@regc% +} + +\def\pstFP@@mul#1#2#3{% + \pstFP@regc=\csname pstFP@x#1\endcsname% + \multiply\pstFP@regc\csname pstFP@y#2\endcsname% + \advance\pstFP@prod\pstFP@regc% + % + \ifx#3\relax% + \let\next=\relax% + \else% + \let\next=\pstFP@@mul% + \fi% + \next#3% +} + +\def\pstFP@saveshift{% + % save rightmost three digits + \pstFP@regc=\pstFP@prod% + \divide\pstFP@prod1000\relax% + \multiply\pstFP@prod1000\relax% + \advance\pstFP@regc-\pstFP@prod% + \advance\pstFP@regc1000\relax% + \edef\pstFP@rd{\expandafter\pstFP@ignorenext\the\pstFP@regc\pstFP@rd}% + % + \divide\pstFP@prod1000\relax% +} + +\def\pstFP@mul#1#2.#3.#4\relax#5.#6.#7\relax{% + % #1 macro, which gets the result + % #2 integer part of 1st value + % #3 fractional part of 1st value + % #4 dummy to swallow everthing after the 2nd '.' + % #5 integer part of 2nd value + % #6 fractional part of 2nd value + % #7 dummy to swallow everthing after the 2nd '.' + % + % split value in various parts + % x y = 123 456 789 123 456 789 . 123 456 789 123 456 789 + % -> xk xl xm xn xo xp xq xr xs xt xu xv + % -> yk yl ym yn yo yp yq yr ys yt yu yv + % multiply these parts and save the result wrt the necessary shifts + % + {\pstFP@readvalue{x}{#2}{#3}% + \pstFP@readvalue{y}{#5}{#6}% + % + %sign + \multiply\pstFP@xs\pstFP@ys% + \pstFP@rs=\pstFP@xs% + % + % split parts + \pstFP@split\pstFP@xk\pstFP@xl\pstFP@xm\pstFP@xia\pstFP@split\pstFP@xn\pstFP@xo\pstFP@xp\pstFP@xib% + \pstFP@split\pstFP@xq\pstFP@xr\pstFP@xz\pstFP@xfa\pstFP@split\pstFP@xt\pstFP@xu\pstFP@xv\pstFP@xfb% + \pstFP@split\pstFP@yk\pstFP@yl\pstFP@ym\pstFP@yia\pstFP@split\pstFP@yn\pstFP@yo\pstFP@yp\pstFP@yib% + \pstFP@split\pstFP@yq\pstFP@yr\pstFP@yz\pstFP@yfa\pstFP@split\pstFP@yt\pstFP@yu\pstFP@yv\pstFP@yfb% + % + \pstFP@prod=0\relax% + \edef\pstFP@rd{}% + % + %compute result + \pstFP@@mul vv \relax\pstFP@saveshift% + \pstFP@@mul vu uv \relax\pstFP@saveshift% + \pstFP@@mul uu vt tv \relax\pstFP@saveshift% + \pstFP@@mul ut tu vz zv \relax\pstFP@saveshift% + \pstFP@@mul tt zu uz rv vr \relax\pstFP@saveshift% + \pstFP@@mul zt tz ur ru vq qv \relax\pstFP@saveshift% + \pstFP@@mul zz rt tr uq qu vp pv \relax\pstFP@saveshift% + \pstFP@@mul zr rz tq qt up pu vo ov \relax\pstFP@saveshift% + \pstFP@@mul rr qz zq tp pt uo ou vn nv \relax\pstFP@saveshift% + \pstFP@@mul rq qr zp pz to ot un nu vm mv \relax\pstFP@saveshift% + \pstFP@@mul qq rp pr zo oz tn nt um mu vl lv \relax\pstFP@saveshift% + \pstFP@@mul qp pq ro or zn nz tm mt ul lu kv vk \relax\pstFP@saveshift% + \pstFP@@mul pp oq qo rn nr zm mz tl lt ku uk \relax\pstFP@saveshift% + \pstFP@@mul op po nq qn rm mr zl lz tk kt \relax\pstFP@saveshift% + \pstFP@@mul oo pn np mq qm rl lr kz zk \relax\pstFP@saveshift% + \pstFP@@mul no on mp pm lq ql kr rk \relax\pstFP@saveshift% + \pstFP@@mul nn mo om pl lp qk kq \relax\pstFP@saveshift% + \pstFP@@mul mn nm lo ok pk kp \relax\pstFP@saveshift% + \pstFP@@mul mm ln nl ko ok \relax\pstFP@saveshift% + \pstFP@@mul lm ml kn nk \relax\pstFP@saveshift% + \pstFP@@mul ll km mk \relax\pstFP@saveshift% + \pstFP@@mul kl lk \relax\pstFP@saveshift% + \pstFP@@mul kk \relax\pstFP@saveshift\pstFP@saveshift% + \pstFP@ninesplit\pstFP@rd% + \ifnum\pstFP@res=0\relax% + \pstFP@ninesplit\pstFP@rd% + \ifnum\pstFP@res=0\relax% + \pstFP@ninesplit\pstFP@rd\pstFP@ria=\pstFP@res% + \pstFP@ninesplit\pstFP@rd\pstFP@rib=\pstFP@res% + \pstFP@ninesplit\pstFP@rd\pstFP@rfa=\pstFP@res% + \pstFP@ninesplit\pstFP@rd\pstFP@rfb=\pstFP@res% + \pstFP@store\pstFP@tmp{r}% + \else\typeout{pstFPmul: Overflow}\fi% + \else\typeout{pstFPmul: Overflow}\fi% + \global\let\pstFP@tmp\pstFP@tmp}% + \let#1\pstFP@tmp% +} % \catcode`\@=\PstAtCode\relax % |