diff options
author | Karl Berry <karl@freefriends.org> | 2013-01-12 00:02:04 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-01-12 00:02:04 +0000 |
commit | cc53d59f49808d6b80420a89e05e3f39ad96412a (patch) | |
tree | f36727477016c8570f3016dd2f2c9f4c3890240b /Master/texmf-dist/doc/generic/minifp/test2.tex | |
parent | 84897d5d7dcc5750e11a40c7a1f4d2d2f6154bc7 (diff) |
minifp (11jan13)
git-svn-id: svn://tug.org/texlive/trunk@28804 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/generic/minifp/test2.tex')
-rw-r--r-- | Master/texmf-dist/doc/generic/minifp/test2.tex | 376 |
1 files changed, 376 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/minifp/test2.tex b/Master/texmf-dist/doc/generic/minifp/test2.tex new file mode 100644 index 00000000000..8cd7ab278c5 --- /dev/null +++ b/Master/texmf-dist/doc/generic/minifp/test2.tex @@ -0,0 +1,376 @@ +\errorcontextlines999\relax +X\input minifp.sty\relax X\MFPloadextra X +\def\empty{} + +\def\frac#1#2{{#1\over#2}} +\def\cs#1{{\tt \char`\\#1}} +\def\mybreak{\vskip 0pt plus 100pt\penalty 0 \vskip 0pt plus -100pt\relax} +\def\\{\hfil\break\ignorespaces} +\def\y{Rpop\Z\Z\\} +\def\Y{Rpop\Z\Z} +\everymath{\displaystyle} + +{\bf Stack-only operations:}\\ +Example of a program. Computes the solution of $ax^2 + bx + c = 0$ using +the quadratic formula. If the result is complex, it detects this. +Coefficients stored in \cs{A}, \cs{B} and \cs{C}. First case: $4x^2 + +5y^2 - 1= 0$. Solutions are $x = -\frac{5}{8} \pm \frac{1}{8}\sqrt{41}$ + +\def\A{4}\def\B{5}\def\C{-1} + +X\startMFPprogram % stack +\Rpush\B\Rdup\Rsq % B(B^2) +\Rpush\A\Rpush\C\Rmul\Rdbl\Rdbl % B(B^2)(4AC) +\Rsub % B(B^2-4AC) +\IFneg{\def\I{i}\Rchs}{\def\I{}}% % B(|B^2-4AC|) +\Rsqrt\Rpush\A\Rdbl\Rdiv % B(sqrt(|B^2-4AC|)/2A) +\Rpop\Ypart % B +\Rpush\A\Rdbl\Rdiv\Rchs % (-B/2A) +\Rpop\Xpart % +%\expandafter\show\csname MFP@Rstack\endcsname +\Rpush\Xpart\Rpush\Ypart\Radd\Rpop\Broot +\Rpush\Xpart\Rpush\Ypart\Rsub\Rpop\Sroot +\Export\Xpart +\Export\Ypart +\Export\Broot +\Export\Sroot +\Export\I +\stopMFPprogram X + +\indent Solution: $x = \Xpart \pm \I\Ypart = \Broot$ and $\Sroot$. + +Second case $2x^2 - 2x + 3 = 0$. Solutions are $x = \frac{1}{2} \pm +\frac{i}{2}\sqrt{5}$. + +\def\A{2}\def\B{-2}\def\C{3} + +X\startMFPprogram % stack +\Rpush\B\Rdup\Rsq % B(B^2) +\Rpush\A\Rpush\C\Rmul\Rdbl\Rdbl % B(B^2)(4AC) +\Rsub % B(B^2-4AC) +\IFneg{\def\I{i}\Rchs}{\def\I{}}% % B(|B^2-4AC|) +\Rsqrt\Rpush\A\Rdbl\Rdiv % B(sqrt(|B^2-4AC|)/2A) +\Rpop\Ypart % B +\Rpush\A\Rdbl\Rdiv\Rchs % (-B/2A) +\Rpop\Xpart % +\Export\Xpart +\Export\Ypart +\Export\I +\stopMFPprogram X + +%\expandafter\show\csname MFP@Rstack\endcsname +\indent Solution: $x = \Xpart \pm \I\Ypart$. + +Now try square roots (should be exactly 1234.5678 and 1524): +X\startMFPprogram % stack +\Rpush{1524157.65279684}\Rsqrt\Rpop\X +\Rpush{1524}\Rsq\Rsqrt\Rpop\Y +\Export\X +\Export\Y +\stopMFPprogram X \X { and }\Y. + + +Below we test for speed and to check for any space characters +accidentally produced. You should see only a few xX pairs with hopefully +no spaces in between them. As curently set up, these tests perform about +34000 numerical operations. It all takes about 31 seconds on a +moderately old (2 years?) Windows 7 running plain tex from +TeX~Live~2012. + +This operation count does not distinguish between basic operations like +addition and multiplication, and those operations from mfpextra that are +probably each equivalent to a dozen or more multiplications. Counting +each such operation with the an estimated multiplicity, the tests +probably perform 400 thousand or more basic operations. + +Of the basic operations, multiplication is (by measurement) 4 times as +lengthy as addition, and division is about twice as lengthy as +multiplication. Actual times depend on the machine, but the ratios remain +pretty much the same. Here is a summary of timings on my fastest +machine; each operation is run 500 times in a loop: + +\medskip + +\indent\vtop{\halign{\hfil$#$&\quad$#\,$sec\cr +\noalign{\hrule\smallskip} +2.54321+22432.87654321 &0.015\cr +2.54321\times22432.87654321 &0.06\cr +22432.87654321/2.54321 &0.14\cr +\sqrt{23456789.54321} &0.20\cr +1.00001234^{8000} &0.73\cr +\exp(2.54321) &0.41\cr +\sin(2.54321) &0.45\cr +\log(2.54321) &0.53\cr +\mathop{\fam0 angle}(254.321,100) &1.17\cr +\noalign{\smallskip\hrule} +}} + +\medskip + +Originally, all the tests combined took 21 seconds on a 4-year-old +Windows XP under TeX Live 2011. But since then I have changed angle and +power computations so that they are considerably more accurate, but with +a possible reduction in speed. Of course, some of the speed loss may be +due to the operating system. + +On a Windows 7 machine, 64-bit, laptop, it takes 32 seconds to process +this file. On another Win7, machine, 32-bit, desktop, it takes 10 +seconds. + +The difference could be explained partially by the fact that the second +machine is newer and partially by the fact that TeX is a 32-bit program, +and therefore a better match to the operating system of the second +system. + +\def\testi{% stack forms +\startMFPprogram +\Rpush{0.000 001}\Rpop\X +\Rpush{1.2}\Rpush{-2.3}\Rexch\Rdup +\Rpop\X\Rpop\X +\Rpop\X\Rpush{21.34}\Rchs +\Rpop\X\Rpush{21.34}\Rabs +\Rpop\X\Rpush{21.34}\Rchs +\Rpop\X\Rpush{21.34}\Rint +\Rpop\X\Rpush{21.34}\Rfrac +\Rpop\X\Rpush{21.34}\Rdbl +\Rpop\X\Rpush{21.34}\Rhalve +\Rpop\X\Rpush{21.34}\Rsgn +\Rpop\X\Rpush{21.34}\Rsin +\Rpop\X\Rpush{21.34}\Rcos +\Rpop\X\Rpush{21.34}\Rdeg +\Rpop\X\Rpush{21.34}\Rrad +\Rpop\X\Rpush{21.34}\Rlog +\Rpop\X\Rpush{21.34}\Rln +\Rpop\X\Rpush{-1.34}\Rexp +\Rpop\X\Rpush{3.3}\Rexp +\Rpop\X\Rpush{21.34}\Rsq +\Rpop\X\Rpush{21.34}\Rinv +\Rpop\X\Rpush{21.34}\Rfloor +\Rpop\X\Rpush{21.34}\Rceil +\Rpop\X\Rpush{21.34}\Rsqrt +\Rpop\X\Rpush{21.34}\Rpush{12.34}\Rcmp +\IFlt{}{}\IFgt{}{}\IFeq{}{}\Rsub +\IFneg{}{}\IFpos{}{}\IFzero{}{}\Rpop\X +\Rpush{1.2}\Rpush{-2.3}\Radd +\Rpop\X\Rpush{1.2}\Rpush{-2.3}\Rsub +\Rpop\X\Rpush{1.2}\Rpush{-2.3}\Rmul +\Rpop\X\Rpush{1.2}\Rpush{-2.3}\Rdiv +\Rpop\X\Rpush{2.3}\Rpush{17}\Rpow +\Rpop\X\Rpush{2.3}\Rpush{-17}\Rpow +\Rpop\X\Rpush{1.2}\Rpush{-2.3}\Rmax +\Rpop\X\Rpush{1.2}\Rpush{-2.3}\Rmin +\stopMFPprogram} + +\def\testii{% unary operand forms, including +\MFPchs\X\Z % extra tests of sin, log, exp and pow +\MFPchs\Y\Z +\MFPabs\X\Z +\MFPabs\Y\Z +\MFPdbl\X\Z +\MFPdbl\Y\Z +\MFPhalve\X\Z +\MFPhalve\Y\Z +\MFPint\X\Z +\MFPint\Y\Z +\MFPsgn\X\Z +\MFPsgn\Y\Z +\MFPsq\X\Z +\MFPsq\Y\Z +\MFPinv\X\Z +\MFPinv\Y\Z +\MFPfrac\X\Z +\MFPfrac\Y\Z +\MFPfloor\X\Z +\MFPfloor\Y\Z +\MFPceil\X\Z +\MFPceil\Y\Z +\MFPsin{30}\Z +\MFPsin{420}\Z +\MFPcos{60}\Z +\MFPcos{390}\Z +\MFPlog\X\Z +\MFPln\X\Z +\MFPexp\X\Z +\MFPexp\Y\Z +\MFPsin{1}\Z +\MFPsin{2}\Z +\MFPsin{3}\Z +\MFPsin{4}\Z +\MFPsin{5}\Z +\MFPsin{6}\Z +\MFPsin{7}\Z +\MFPsin{8}\Z +\MFPsin{9}\Z +\MFPsin{10}\Z +\MFPsin{20}\Z +\MFPsin{30}\Z +\MFPsin{40}\Z +\MFPsin{50}\Z +\MFPsin{60}\Z +\MFPsin{70}\Z +\MFPsin{80}\Z +\MFPsin{90}\Z +\MFPlog{.1}\Z +\MFPlog{.2}\Z +\MFPlog{.3}\Z +\MFPlog{.4}\Z +\MFPlog{.5}\Z +\MFPlog{.6}\Z +\MFPlog{.7}\Z +\MFPlog{.8}\Z +\MFPlog{.9}\Z +\MFPlog{1}\Z +\MFPlog{1.01}\Z +\MFPlog{1.02}\Z +\MFPlog{1.03}\Z +\MFPlog{1.04}\Z +\MFPlog{1.05}\Z +\MFPlog{1.06}\Z +\MFPlog{1.07}\Z +\MFPlog{1.08}\Z +\MFPlog{1.09}\Z +\MFPexp{.000001}\Z +\MFPexp{.00001}\Z +\MFPexp{.0001}\Z +\MFPexp{.001}\Z +\MFPexp{.01}\Z +\MFPexp{.1}\Z +\MFPexp{1}\Z +\MFPexp{2}\Z +\MFPexp{3}\Z +\MFPexp{4}\Z +\MFPexp{5}\Z +\MFPexp{6}\Z +\MFPexp{7}\Z +\MFPexp{8}\Z +\MFPexp{9}\Z +\MFPexp{10}\Z +\MFPexp{-8.3254}\Z +\MFPpow\MFPe{-10}\Z +\MFPpow\MFPe{-9}\Z +\MFPpow\MFPe{-8}\Z +\MFPpow\MFPe{-7}\Z +\MFPpow\MFPe{-6}\Z +\MFPpow\MFPe{-5}\Z +\MFPpow\MFPe{-4}\Z +\MFPpow\MFPe{-3}\Z +\MFPpow\MFPe{-2}\Z +\MFPpow\MFPe{-1}\Z +\MFPpow\MFPe{0}\Z +\MFPpow\MFPe{1}\Z +\MFPpow\MFPe{2}\Z +\MFPpow\MFPe{3}\Z +\MFPpow\MFPe{4}\Z +\MFPpow\MFPe{5}\Z +\MFPpow\MFPe{6}\Z +\MFPpow\MFPe{7}\Z +\MFPpow\MFPe{8}\Z +\MFPpow\MFPe{9}\Z +\MFPpow\MFPe{10}\Z} + +\def\testiii{%% binary operand forms and print formating, plus +\MFPsqrt{0}\Z % additional tests of sqrt +\MFPsqrt{1}\Z +\MFPsqrt{2}\Z +\MFPsqrt{3}\Z +\MFPsqrt{4}\Z +\MFPsqrt{5}\Z +\MFPsqrt{6}\Z +\MFPsqrt{7}\Z +\MFPsqrt{8}\Z +\MFPsqrt{9}\Z +\MFPsqrt{10}\Z +\MFPsqrt{1524157.65279684}\Z +\MFPadd\X\Y\Z +\MFPsub\X\Y\Z +\MFPsub\Y\X\Z +\MFPsub\X\X\Z +\MFPsub\Y\Y\Z +\MFPmul\X\Y\Z +\MFPdiv\X\Y\Z +\MFPdiv\Y\X\Z +\MFPmax\X\Y\Z +\MFPmin\X\Y\Z +\MFPpow\X{5}\Z +\MFPpow\X{-5}\Z +\MFPpow\Y{5}\Z +\MFPpow\Y{-5}\Z +\MFPcmp\X\Y +\IFlt{}{}\IFgt{}{}\IFeq{}{}% +\MFPsub\X\Y\Z +\IFneg{}{}\IFpos{}{}\IFzero{}{}% +\def\T{333.00000000}% +\def\S{1357.12345678}% +\MFPtruncate{4}\T\Z +\MFPtruncate{0}\T\Z +\MFPtruncate{-2}\T\Z +\MFPstrip\T\Z +\MFPstrip*\T\Z +\MFPround{3}\S\Z +\MFPround{5}\S\Z +\MFPround{0}\S\Z +\MFPround{-2}\S\Z +\def\T{-333.00000000}% +\def\S{-1357.12345678}% +\MFPtruncate{4}\T\Z +\MFPtruncate{0}\T\Z +\MFPtruncate{-2}\T\Z +\MFPstrip\T\Z +\MFPstrip*\T\Z +\MFPround{3}\S\Z +\MFPround{5}\S\Z +\MFPround{0}\S\Z +\MFPround{-2}\S\Z} + +Three test loops follow. The first repeats 500 times a stack program +that performs each available command followed by popping the result and +repushing the original value(s). + +\newcount\n +\def\testloopi{% + \ifnum \n>0 + \advance\n -1 + \testi + \expandafter + \testloopi + \fi +} +\n=500 +x\testloopi X + + +The second repeats 100 times a sequence in which all the unary operand +commands are performed twice, plus extra of sine, log and exp. + +\def\testloopii{% + \ifnum \n>0 + \advance\n -1 + \testii + \expandafter + \testloopii + \fi +} +\def\X{1.2} +\def\Y{-2.3} +\n=100 +x\testloopii X + + +The third repeats 100 times a sequence in which all the binary operand +commands are performed, plus some extra tests of sqrt and then all the +print-preparation commands. + +\def\testloopiii{% + \ifnum \n>0 + \advance\n -1 + \testiii + \expandafter + \testloopiii + \fi +} + +\n=100 +x\testloopiii X +\end + +\end{document} |