summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pstricks-add/pst-fp.tex
diff options
context:
space:
mode:
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.tex132
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
%