diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/generic/realcalc |
Initial commit
Diffstat (limited to 'macros/generic/realcalc')
-rw-r--r-- | macros/generic/realcalc/readme | 39 | ||||
-rw-r--r-- | macros/generic/realcalc/realcalc.tex | 581 | ||||
-rw-r--r-- | macros/generic/realcalc/realdemo.tex | 6 | ||||
-rw-r--r-- | macros/generic/realcalc/realtest.tex | 291 |
4 files changed, 917 insertions, 0 deletions
diff --git a/macros/generic/realcalc/readme b/macros/generic/realcalc/readme new file mode 100644 index 0000000000..aa152337fb --- /dev/null +++ b/macros/generic/realcalc/readme @@ -0,0 +1,39 @@ +realcalc.tex + +(Copyright) Frank Buchholz, Jan. 1993 +e-mail: buchholz@lusty.informatik.uni-dortmund.de + +Real arithmetic with big values and high precision. +Calculations are done with 9 decimal digits. +Usable with TeX and LaTeX. + +Files: + readme This file + realcalc.tex You have to \input realcalc.tex to use it. + realdemo.tex Demo with LaTeX. + realtest.tex Demo with TeX (Type \test\bye after the prompt) + +Installation: + Put the file realcalc.tex where your TeX looks for inputs. + Name a copy realcalc.sty to use as a LaTeX style option, + or create a file realcalc.sty with the lines: + \input realcalc.tex + \endinput + +Documentation: + Use following command to extract the documentation: + grep %% realcalc.tex + +COPYING: + Copying of part or all of this file is allowed under the following + conditions only: + (1) You may freely distribute unchanged copies of the files. You have + to include this file when you do so. + (2) You may modify a renamed copy of the files, but only for personal + use or use within an organization. + (3) You may copy fragments from the files, for personal use or for + distribution, as long as credit is given where credit is due. + + You are NOT ALLOWED to take money for the distribution or use of + this file or modified versions or fragments thereof, except for + a nominal charge for copying etc. diff --git a/macros/generic/realcalc/realcalc.tex b/macros/generic/realcalc/realcalc.tex new file mode 100644 index 0000000000..be46167fc4 --- /dev/null +++ b/macros/generic/realcalc/realcalc.tex @@ -0,0 +1,581 @@ +%% realcalc.tex +%% +%% (C) Frank Buchholz, Jan. 1993 +%% e-mail: buchholz@lusty.informatik.uni-dortmund.de +% User documentation: All lines starting with two % +% Try grep to extract these lines. +%% +%% Real arithmetic with big values and high precision. +%% Calculations are done with 9 decimal digits. +%% Usable with TeX and LaTeX. +%% +%% Parameter: +%% +%% <macro> Macro, witch catches the result. +%% <value> String or macro witch expands to a value in the range +%% from -2147483647.999999999 to 2147483647.999999999 +%% <precision> Number from 0 to 9 +%% +%% Functions: +%% + +% Don't read this file twice +\ifx\Radd\undefined \else \endinput \fi + +% Make "@" be a letters +\chardef\catamp=\the\catcode`\@ +\catcode`@=11 + +\def\@Rversion{Version 1.0, Jan. 1993} +\message{`Real arithmetic', \@Rversion (C) Frank Buchholz} + +% Allocation of temporary registers +\newcount\@ta +\newcount\@tb +% +\newcount\@xs % Sign of 1st value +\newcount\@xi % Integer part of 1st value +\newcount\@xf % Fractional part of 1st value +% +\newcount\@ys % Sign of 2nd value +\newcount\@yi % Integer part of 2nd value +\newcount\@yf % Fractional part of 2nd value +% +\newcount\@mil \@mil=1000000000 % 10^9 +% +\countdef\@xa240 +\countdef\@xb241 +\countdef\@xc242 +\countdef\@xd243 +\countdef\@xe244 +\countdef\@ya245 +\countdef\@yb246 +\countdef\@yc247 +\countdef\@yd248 +\countdef\@ye249 +\let\@f=\@tb +\let\@product=\@ta + +\chardef\@zero=0 + +%% \Radd<macro><value><value> Addition +\def\Radd#1#2#3{\@callc\@Radd#1{#2}{#3}} + +%% \Rsub<macro><value><value> Subtraction +\def\Rsub#1#2#3{\@callc\@Radd#1{#2}{-#3}} + +\def\@Radd#1#2.#3.#4\relax#5.#6.#7\relax{% + % #1 Macro, witch 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 '.' + % + \@readvalue\@xs\@xi\@xf{#2}{#3}% + \@readvalue\@ys\@yi\@yf{#5}{#6}% + % + % Add integer parts + \@ta=\@xi \advance\@ta\@yi% + % + % Add fractional parts if they are not zero + \ifnum\@xf=\@zero% + \ifnum\@yf=\@zero% + \@tb=\@zero% + \else% + \@longadd% + \fi% + \else% + \@longadd% + \fi% + % + % Store result + \@store#1\@ta\@tb% +} + +\def\@longadd{% + % Propagate sign to fractional parts + \multiply\@xf\@xs \multiply\@yf\@ys% + % + % Add fractional parts + \@tb=\@xf \advance\@tb\@yf% + % + % Calculate carry + \ifnum\@tb<\@zero% + \ifnum\@tb<-\@mil \advance\@ta -\@ne \advance\@tb\@mil \fi% + \else% + \ifnum\@tb<\@mil \else \advance\@ta \@ne \advance\@tb-\@mil \fi% + \fi% +} + +%% \Rmul<macro><value><value> Multiplication +\def\Rmul#1#2#3{\@callc\@Rmul#1{#2}{#3}} + +\def\@Rmul#1#2.#3.#4\relax#5.#6.#7\relax{% + % #1 Macro, witch 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 '.' + % + % How to do real multiplications: + % Split values in various parts + % x y = 1234 567890 . 123 456 789 + % -> xa xb xc xd xe + % -> ya yb yc yd ye + % Do 21 (!) integer multiplications if there are any fractional parts + % r = x * Y + % -> r = xi*yi + % + (xa*yc + xa*yc )*10^3 + % + (xa*yd + xd*ya )*10^-0 + % + (xa*ye + xe*ya + xb*yc + xc*yb)*10^-3 + % + (xb*yd + xd*yb + xc*yc )*10^-6 + % + (xb*ye + xe*yb + xc*yd + xd*yc)*10^-9 + % + (xc*ye + xe*yc + xd*yd )*10^-12 + % + (xd*ye + xe*yd )*10^-15 + % + (xe*ye )*10^-18 + % + % -> r = ((((( xe*ye / 1000 + % + xd*ye + xe*yd ) / 1000 + % + xc*ye + xe*yc + xd*yd ) / 1000 + % + xb*ye + xe*yb + xc*yd + xd*yc ) / 1000 + % + xb*yd + xd*yb + xc*yc ) / 1000 + % + xa*ye + ye*xa + xb*yc + xc*yb ) / 1000 + % + xa*yd + xd*ya + (xa*yc + ya*xc)*1000 + xi*yi + % The last three digigs are saved just before the divisions. + % + % Init + % + \@readvalue\@xs\@xi\@xf{#2}{#3}% + \@readvalue\@ys\@yi\@yf{#5}{#6}% + % + % Sign + \multiply\@xi\@xs% + \multiply\@yi\@ys% + \multiply\@xs\@ys% + % + \@product=\@zero% + % + \ifnum\@xf=\@zero% + \ifnum\@yf=\@zero% + % No fractional parts + \edef\@frac{000000000} % digits of fractional part + \else% + \@longmul % Long multiplication + \fi% + \else% + \@longmul % Long multiplication + \fi% + % + % Multiply integer parts + \count@=\@xi \multiply\count@\@yi% + \advance\@product\count@% + % + % Sign + \multiply\@product\@xs% + % + % Store result + \edef#1{\number\@product.\@frac}% +} + +% Do long multiplication +\def\@longmul{% + % Split values in pieces + \@f=1000000% + \count@=\@xi% + \divide\count@\@f \@xa=\count@% + \multiply\count@-\@f \advance\count@\@xi \@xb=\count@% + \count@=\@xf% + \divide\count@\@f \@xc=\count@% + \multiply\count@-\@f \advance\count@\@xf% + \@f=1000% + \@xe=\count@% + \divide\count@\@f \@xd=\count@% + \multiply\count@-\@f \advance\count@\@xe \@xe=\count@% + % + \@f=1000000% + \count@=\@yi% + \divide\count@\@f \@ya=\count@% + \multiply\count@-\@f \advance\count@\@yi \@yb=\count@% + \count@=\@yf% + \divide\count@\@f \@yc=\count@% + \multiply\count@-\@f \advance\count@\@yf% + \@f=1000% + \@ye=\count@% + \divide\count@\@f \@yd=\count@% + \multiply\count@-\@f \advance\count@\@ye \@ye=\count@% + % + \edef\@frac{} % digits of fractional part + % + \@mul ee \relax\@shift % 10^-18 + \@mul de ed \relax\@shift % 10^-15 + \@mul ce ec dd \relax\@shift % 10^-12 + \@mul be eb cd dc \relax\@saveshift % 10^-9 + \@mul bd db cc \relax\@saveshift % 10^-6 + \@mul ae ea bc cb \relax\@saveshift % 10^-3 + \multiply\@xa\@f \multiply\@xc\@f % 10^3 + \@mul ad da ac ca \relax% +} + +\def\@mul#1#2#3{% + \count@=\csname @x#1\endcsname% + \multiply\count@\csname @y#2\endcsname% + \advance\@product\count@% + % + \ifx#3\relax% + \let\next=\relax% + \else% + \let\next=\@mul% + \fi% + \next#3% +} + +\def\@shift{% + \divide\@product\@f% +} + +\def\@saveshift{% + % Save rightmost digits + \count@=\@product% + \divide\@product\@f% + \multiply\@product\@f% + \advance\count@-\@product% + \advance\count@\@f% + \edef\@frac{\expandafter\@ignorenext\number\count@\@frac}% + % + \divide\@product\@f% +} + +%% \Rdiv<macro><value><value> Division +\def\Rdiv#1#2#3{\@callc\@Radd#1{#2}{#3}} + +\def\@Rdiv#1#2.#3.#4\relax#5.#6.#7\relax{% + % #1 Macro, witch 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 '.' + % + \message{Error: Rdiv not ready} + % + \@readvalue\@xs\@xi\@xf{#2}{#3}% + \@readvalue\@ys\@yi\@yf{#5}{#6}% + % + \ifnum\@yi=\@zero + \@xi=\@zero + \else + \divide\@xi\@yi + \fi + % + \@store#1\@xi\@xf% +} + +%% \Rneg<macro><value> Negation +\def\Rneg#1#2{% + % Expand the value and split it into the integer and the fractional part + \edef\next{\noexpand\@Rneg\noexpand#1#2..\noexpand\relax}% + \next% +} + +\def\@Rneg#1#2.#3.#4\relax{ + % #1 Macro, witch gets the result + % #2 Integer part of value + % #3 Fractional part of value + % #4 Remaining tokens + % + \@readvalue\@xs\@xi\@xf{#2}{#3}% + % + % Change sign + \multiply\@xi-\@ne% + \multiply\@xf-\@xs% + % + % Store result + \@store#1\@xi\@xf% +} + +%% +%% \Rtrunc<macro><precision><value> Truncate value to specified precision +\def\Rtrunc#1#2#3{% + % Expand parameter and split the value into the integer and fractional part + \edef\next{\noexpand\@Rtrunc\noexpand#1#2#3..\noexpand\relax}% + \next% +} + +\def\@Rtrunc#1#2#3.#4.#5\relax{% + % #1 Macro, witch gets the result + % #2 Number of decimal places + % #3 Integer part of value + % #4 Fractional part of value + % #5 dummy to swallow everthing after the 2nd '.' + % + \count@=#2% + \edef\next{\empty}% + \ifnum\count@>\@zero% + \expandafter\@@Rtrunc#4000000000\relax% + \fi% + \edef#1{#3\next}% +} + +\def\@@Rtrunc#1#2#3#4#5#6#7#8#9{% + % #1...#9 fractional part, padded with trailing zeros + \edef\next{.#1% + \ifnum\count@>1 #2\fi% + \ifnum\count@>2 #3\fi% + \ifnum\count@>3 #4\fi% + \ifnum\count@>4 #5\fi% + \ifnum\count@>5 #6\fi% + \ifnum\count@>6 #7\fi% + \ifnum\count@>7 #8\fi% + \ifnum\count@>8 #9\fi% + }% + \@swallow% +} + +%% +%% \Rifle<value><value> Test v1 < v2 +\def\Rifle#1#2{\@callb\@Rifle{#1}{#2}} + +\def\@Rifle#1.#2.#3\relax#4.#5.#6\relax{% + % #1 integer part of 1st value + % #2 fractional part of 1st value + % #3 dummy to swallow everthing after the 2nd '.' + % #4 integer part of 2nd value + % #5 fractional part of 2nd value + % #6 dummy to swallow everthing after the 2nd '.' + % + \@readvalue\@xs\@xi\@xf{#1}{#2}% + \@readvalue\@ys\@yi\@yf{#4}{#5}% + % + \ifnum\@xs<\@ys% + \Rtesttrue% + \else% + \ifnum\@xs>\@ys% + \Rtestfalse% + \else% + \Rtestfalse% + \ifnum\@xi<\@yi \Rtesttrue \fi% + \ifnum\@xi=\@yi% + \multiply\@xf\@xs \multiply\@yf\@ys% + \ifnum\@xf<\@yf \Rtesttrue \fi% + \fi% + \fi% + \fi% + % + \ifRtest% +} + +%% \Rifeq<value><value> Test v1 = v2 +\def\Rifeq#1#2{\@callb\@Rifeq{#1}{#2}} + +\def\@Rifeq#1.#2.#3\relax#4.#5.#6\relax{% + % #1 integer part of 1st value + % #2 fractional part of 1st value + % #3 dummy to swallow everthing after the 2nd '.' + % #4 integer part of 2nd value + % #5 fractional part of 2nd value + % #6 dummy to swallow everthing after the 2nd '.' + % + \@readvalue\@xs\@xi\@xf{#1}{#2}% + \@readvalue\@ys\@yi\@yf{#4}{#5}% + % + \Rtestfalse% + \ifnum\@xi=\@yi\ifnum\@xf=\@yf \Rtesttrue \fi\fi% + \ifRtest% +} + +%% \Rifgt<value><value> Test v1 > v2 +\def\Rifgt#1#2{\@callb\@Rifgt{#1}{#2}} + +\def\@Rifgt#1.#2.#3\relax#4.#5.#6\relax{% + % #1 integer part of 1st value + % #2 fractional part of 1st value + % #3 dummy to swallow everthing after the 2nd '.' + % #4 integer part of 2nd value + % #5 fractional part of 2nd value + % #6 dummy to swallow everthing after the 2nd '.' + % + \@readvalue\@xs\@xi\@xf{#1}{#2}% + \@readvalue\@ys\@yi\@yf{#4}{#5}% + % + \ifnum\@xs>\@ys% + \Rtesttrue% + \else% + \ifnum\@xs<\@ys% + \Rtestfalse% + \else% + \Rtestfalse% + \ifnum\@xi>\@yi \Rtesttrue \fi% + \ifnum\@xi=\@yi% + \multiply\@xf\@xs \multiply\@yf\@ys% + \ifnum\@xf>\@yf \Rtesttrue \fi% + \fi% + \fi% + \fi% + % + \ifRtest% +} + +%% \Rifneg<value> Test v < 0 +\def\Rifneg#1{\@calla\@Rifneg{#1}} + +\def\@Rifneg#1.#2.#3\relax{% + % #1 Integer part of value + % #2 Fractional part of value + % #3 dummy to swallow everthing after the 2nd '.' + % + \@readvalue\@xs\@xi\@xf{#1}{#2}% + % + \ifnum\@xs<0 \Rtesttrue \else \Rtestfalse \fi% + \ifRtest% + } + +%% \Rifzero<value> Test v = 0 +\def\Rifzero#1{\@calla\@Rifzero{#1}} + +\def\@Rifzero#1.#2.#3\relax{% + % #1 Integer part of value + % #2 Fractional part of value + % #3 dummy to swallow everthing after the 2nd '.' + % + \@readvalue\@xs\@xi\@xf{#1}{#2}% + % + \Rtestfalse% + \ifnum\@xi=\@zero \ifnum\@xf=\@zero \Rtesttrue \fi \fi% + \ifRtest% +} + +%% \Rifpos<value> Test v >= 0 +%% Take care to have a corresponding \fi +\def\Rifpos#1{\@calla\@Rifpos{#1}} + +\def\@Rifpos#1.#2.#3\relax{% + % #1 Integer part of value + % #2 Fractional part of value + % #3 dummy to swallow everthing after the 2nd '.' + % + \@readvalue\@xs\@xi\@xf{#1}{#2}% + % + \ifnum\@xs<0 \Rtestfalse \else \Rtesttrue \fi% + \ifRtest% +} + +%% \Rifint<value> Test v is an integer value +%% Take care to have a corresponding \fi +\def\Rifint#1{\@calla\@Rifint{#1}} + +\def\@Rifint#1.#2.#3\relax{% + % #1 Integer part of value + % #2 Fractional part of value + % #3 dummy to swallow everthing after the 2nd '.' + % + \@readvalue\@xs\@xi\@xf{#1}{#2}% + % + \ifnum\@xf=0 \Rtesttrue \else \Rtestfalse \fi% + \ifRtest% +} + +% Utility macros + +\def\@calla#1#2{% + % #1 Macro to call + % #2 Value + % Expand the value and split them into the integer and the fractional part + \edef\next{\noexpand#1#2..\noexpand\relax}% + \next% +} + +\def\@callb#1#2#3{% + % #1 Macro to call + % #2 1st value + % #3 2nd value + % Expand the values and split them into the integer and the fractional parts + \edef\next{\noexpand#1#2..\noexpand\relax#3..\noexpand\relax}% + \next% +} + +\def\@callc#1#2#3#4{% + % #1 Macro to call + % #2 Macro, witch gets the result + % #3 1st value + % #4 2nd value + % Expand the values and split them into the integer and the fractional parts + \edef\next{\noexpand#1\noexpand#2#3..\noexpand\relax#4..\noexpand\relax}% + \next% +} + +%% \ifRtest ... \else ... \fi Re-execute the last test +\newif\ifRtest + +% +% Read value +% +\def\@readvalue#1#2#3#4#5{% + % #1 macro to catch the sign ( -1 or 1 ) + % #2 macro to catch the integer part (maybe negative) + % #3 macro to catch the fractional part (positive) + % #4.#5 value + % + % Regular expression [-...d]d...["."[d...]] + % Attention: There has to be at least one digit between "-" and "."! + % + % Integer part + \if !#4! #2=\@zero \else #2=#4 \fi% + % + % Sign + \ifnum#2<\@zero #1=-\@ne \else #1=\@ne \fi% + \ifnum#2=\@zero \ifnum #4#5<\@zero #1=-\@ne \fi \fi% + % + % Fractional part + \if !#5!% + #3=\@zero% + \else% + \@@setcount@#5000000000\relax% + #3=\count@% + \fi% +} + +% Set count@ to fractional part with trailing zeros +\def\@@setcount@#1#2#3#4#5#6#7#8#9{% + % #1...#9 fractional part, padded with '0' + \count@=#1#2#3#4#5#6#7#8#9% + \@swallow% +} + +% Swallow everything up to next \relax +\def\@swallow#1\relax{} + +% +% Store result +% +\def\@store#1#2#3{% + % #1 marcro to catch the result + % #2 counter with integer part (maybe negative) + % #3 counter with fractional part (maybe negative} + % + % Sign + \edef#1{}% + \count@=#3% + \ifnum\count@<\@zero% + \count@=-\count@% + \ifnum#2=\@zero% + \edef#1{-}% + \fi% + \fi% + % + % Pad fractional part with leading zeros + \advance\count@\@mil% + % + % Store result + \edef#1{#1\number#2.\expandafter\@ignorenext\number\count@}% +} + +% Ignore next token +\def\@ignorenext#1{} + +% Restore catcode of "@" +\catcode`\@=\catamp diff --git a/macros/generic/realcalc/realdemo.tex b/macros/generic/realcalc/realdemo.tex new file mode 100644 index 0000000000..fb4022cca1 --- /dev/null +++ b/macros/generic/realcalc/realdemo.tex @@ -0,0 +1,6 @@ +\documentstyle[]{article} +\input{realcalc} +\begin{document} +\input{realtest} +\test +\end{document} diff --git a/macros/generic/realcalc/realtest.tex b/macros/generic/realcalc/realtest.tex new file mode 100644 index 0000000000..7b3a95ef45 --- /dev/null +++ b/macros/generic/realcalc/realtest.tex @@ -0,0 +1,291 @@ +% realcalc.tex +% +% (C) Frank Buchholz, Jan. 1993 +% e-mail: buchholz@lusty.informatik.uni-dortmund.de +%% +%% Type \test\bye +%% + +\input realcalc + +% Test + +\catcode`@=11 + +\def\traceon{% + \tracingonline \@ne + \tracincommands \tw@ + \tracingstats \tw@ + \tracingpages \@ne + \tracingoutput \@ne + \tracinglostchars \@ne + \tracingmacros \tw@ + \tracingparagraphs \@ne + \tracingrestores \@ne + \showboxbreadth \maxdimen + \showboxdepth \maxdimen +} + +\def\traceoff{% + \tracingonline \@zero + \tracingcommands \@zero + \tracingstats \@zero + \tracingpages \@zero + \tracingoutput \@zero + \tracinglostchars \@zero + \tracingmacros \@zero + \tracingparagraphs \@zero + \tracingrestores \@zero + \showboxbreadth \maxdimen + \showboxdepth \maxdimen +} + +\errorstopmode + +\let\sl=\showlists +\let\st=\showthe +\let\s=\show +\def\e{\par \vfill \supereject} + +\def\test{% + \message{Test REALCALC.TEX \@Rversion:} + Test REALCALC.TEX \@Rversion\par\medskip + \testadd\medskip + \testsub\medskip + \testmul\medskip + \testdiv\medskip + \testneg\medskip + \testtrunc\medskip + \testifle\medskip + \testifeq\medskip + \testifgt\medskip + \testifneg\medskip + \testifzero\medskip + \testifpos\medskip + \testifint\medskip +} + +\def\testadd{% + \message{Radd} + Test: Radd\par + \def\a{1234.5678} + \def\b{4321.8765} + \Radd\r{123456789.987654321}{4321.123456789} + \r={123461111.111111110}\par + \Radd\r\a\b \r={5556.4443}\par + \Radd\r{-\a}\b \r={3087.3087}\par + \Radd\r\a{-\b} \r={-3087.3087}\par + \Radd\r{-\a}{-\b} \r={-5556.4443}\par +} + +\def\testsub{% + \message{Rsub} + Test: Rsub\par + \def\a{1234.5678} + \def\b{4321.8765} + \Rsub\r\a{-\b} \r={5556.4443}\par + \Rsub\r{-\a}{-\b} \r={3087.3087}\par + \Rsub\r\a\b \r={-3087.3087}\par + \Rsub\r{-\a}\b \r={-5556.4443}\par +} + +\def\testmul{% + \message{Rmul} + Test: Rmul\par + \def\a{1234} + \def\b{4321} + \Rmul\r{\a}{\b} \Rtrunc\r0\r \r={5332114}\par + \Rmul\r{-\a}{\b} \Rtrunc\r0\r \r={-5332114}\par + \Rmul\r{\a}{-\b} \Rtrunc\r0\r \r={-5332114}\par + \Rmul\r{-\a}{-\b} \Rtrunc\r0\r \r={5332114}\par + \Rmul\r\a0 \Rtrunc\r0\r \r={0}\par + \Rmul\r0\a \Rtrunc\r0\r \r={0}\par + \Rmul\r00 \Rtrunc\r0\r \r={0}\par + \Rmul\r\a1 \Rtrunc\r0\r \r={\a}\par + \Rmul\r1\a \Rtrunc\r0\r \r={\a}\par + \Rmul\r11 \Rtrunc\r0\r \r={1}\par + \Rmul\r\a{-1} \Rtrunc\r0\r \r={-\a}\par + \Rmul\r{-1}\a \Rtrunc\r0\r \r={-\a}\par + \Rmul\r{-1}{-1} \Rtrunc\r0\r \r={1}\par + + \Rmul\r{46340.123456789}{10.123456789}\r={469122.2374}\par + \Rmul\r{46340.123456789}{1}\r={46340.123456789}\par + \Rmul\r{46340.123456789}{100}\r={4634012.3456789}\par + \Rmul\r{0.5}{0.5} \r={0.25}\par + \Rmul\r\r\r \r={0.0625}\par + \Rmul\r\r\r \r={0.00390625}\par + \Rmul\r\r\r \r={0.000015258}\par + \Rmul\r\r\r \r={0}\par + \Rmul\r{1.6}{1.6} \r={2.56}\par + \Rmul\r\r\r \r={6.5536}\par + \Rmul\r\r\r \r={42.94967296}\par + \Rmul\r\r\r \r={1844.674407}\par + \Rmul\r\r\r \r={3402823.669}\par +} + +\def\testdiv{% + \message{Rdiv} + Test: Rdiv\par + not ready\par +} + +\def\testneg{% + \message{Rneg} + Test: Rneg\par + -\ 0 = \Rneg\r{0}\r\par + -\ -1 = \Rneg\r{-1}\r\par + -\ 1 = \Rneg\r{1}\r\par + -\ 0.5 = \Rneg\r{0.5}\r\par + -\ -0.5 = \Rneg\r{-0.5}\r\par + -\ -1234.5678 = \Rneg\r{-1234.5678}\r\par + -\ 1234.5678 = \Rneg\r{1234.5678}\r\par +} + +\def\testtrunc{% + \message{Rtrunc} + Test: Rtrunc\par + \def\a{12345.123456789012345} + 0:\ \Rtrunc\r0\a\r\ \Rtrunc\r00\r\par + 1:\ \Rtrunc\r1\a\r\ \Rtrunc\r10\r\par + 2:\ \Rtrunc\r2\a\r\ \Rtrunc\r20\r\par + 3:\ \Rtrunc\r3\a\r\ \Rtrunc\r30\r\par + 4:\ \Rtrunc\r4\a\r\ \Rtrunc\r40\r\par + 5:\ \Rtrunc\r5\a\r\ \Rtrunc\r50\r\par + 6:\ \Rtrunc\r6\a\r\ \Rtrunc\r60\r\par + 7:\ \Rtrunc\r7\a\r\ \Rtrunc\r70\r\par + 8:\ \Rtrunc\r8\a\r\ \Rtrunc\r80\r\par + 9:\ \Rtrunc\r9\a\r\ \Rtrunc\r90\r\par +} + +\def\testifle{% + \message{Rifle} + Test: Rifle\par + 0 $<$ 0 \Rifle{0}{0} fehler\else ok\fi\par + 0 $<$ 1 \Rifle{0}{1} ok\else fehler\fi\par + 1 $<$ 0 \Rifle{1}{0} fehler\else ok\fi\par + 1 $<$ 1 \Rifle{1}{1} fehler\else ok\fi\par + 1 $<$ 2 \Rifle{1}{2} ok\else fehler\fi\par + 2 $<$ 1 \Rifle{2}{1} fehler\else ok\fi\par + 0 $<$ -1 \Rifle{0}{-1} fehler\else ok\fi\par + -1 $<$ 0 \Rifle{-1}{0} ok\else fehler\fi\par + -1 $<$ -1 \Rifle{-1}{-1} fehler\else ok\fi\par + -1 $<$ -2 \Rifle{-1}{-2} fehler\else ok\fi\par + -2 $<$ -1 \Rifle{-2}{-1} ok\else fehler\fi\par + + 1 $<$ 1.2 \Rifle{1}{1.2} ok\else fehler\fi\par + 1.2 $<$ 1 \Rifle{1.2}{1} fehler\else ok\fi\par + -1 $<$ -1.2 \Rifle{-1}{-1.2} fehler\else ok\fi\par + -1.2 $<$ -1 \Rifle{-1.2}{-1} ok\else fehler\fi\par + + 0.1 $<$ 0.1 \Rifle{0.1}{0.1} fehler\else ok\fi\par + 0.1 $<$ 0.2 \Rifle{0.1}{0.2} ok\else fehler\fi\par + 0.2 $<$ 0.1 \Rifle{0.2}{0.1} fehler\else ok\fi\par + -0.1 $<$ -0.2 \Rifle{-0.1}{-0.2} fehler\else ok\fi\par + -0.1 $<$ -0.1 \Rifle{-0.1}{-0.1} fehler\else ok\fi\par + -0.2 $<$ -0.1 \Rifle{-0.2}{-0.1} ok\else fehler\fi\par +} + +\def\testifeq{% + \message{Rifeq} + Test: Rifeq\par + 0 = 0 \Rifeq{0}{0} ok\else fehler\fi\par + 0 = 1 \Rifeq{0}{1} fehler\else ok\fi\par + 1 = 0 \Rifeq{1}{0} fehler\else ok\fi\par + 1 = 1 \Rifeq{1}{1} ok\else fehler\fi\par + 1 = 2 \Rifeq{1}{2} fehler\else ok\fi\par + 2 = 1 \Rifeq{2}{1} fehler\else ok\fi\par + 0 = -1 \Rifeq{0}{-1} fehler\else ok\fi\par + -1 = 0 \Rifeq{-1}{0} fehler\else ok\fi\par + -1 = -1 \Rifeq{-1}{-1} ok\else fehler\fi\par + -1 = -2 \Rifeq{-1}{-2} fehler\else ok\fi\par + -2 = -1 \Rifeq{-2}{-1} fehler\else ok\fi\par + + 1 = 1.2 \Rifeq{1}{1.2} fehler\else ok\fi\par + 1.2 = 1 \Rifeq{1.2}{1} fehler\else ok\fi\par + -1 = -1.2 \Rifeq{-1}{-1.2} fehler\else ok\fi\par + -1.2 = -1 \Rifeq{-1.2}{-1} fehler\else ok\fi\par + + 0.1 = 0.1 \Rifeq{0.1}{0.1} ok\else fehler\fi\par + 0.1 = 0.2 \Rifeq{0.1}{0.2} fehler\else ok\fi\par + 0.2 = 0.1 \Rifeq{0.2}{0.1} fehler\else ok\fi\par + -0.1 = -0.2 \Rifeq{-0.1}{-0.2} fehler\else ok\fi\par + -0.1 = -0.1 \Rifeq{-0.1}{-0.1} ok\else fehler\fi\par + -0.2 = -0.1 \Rifeq{-0.2}{-0.1} fehler\else ok\fi\par +} + +\def\testifgt{% + \message{Rifgt} + Test: Rifgt\par + 0 $>$ 0 \Rifgt{0}{0} fehler\else ok\fi\par + 0 $>$ 1 \Rifgt{0}{1} fehler\else ok\fi\par + 1 $>$ 0 \Rifgt{1}{0} ok\else fehler\fi\par + 1 $>$ 1 \Rifgt{1}{1} fehler\else ok\fi\par + 1 $>$ 2 \Rifgt{1}{2} fehler\else ok\fi\par + 2 $>$ 1 \Rifgt{2}{1} ok\else fehler\fi\par + 0 $>$ -1 \Rifgt{0}{-1} ok\else fehler\fi\par + -1 $>$ 0 \Rifgt{-1}{0} fehler\else ok\fi\par + -1 $>$ -1 \Rifgt{-1}{-1} fehler\else ok\fi\par + -1 $>$ -2 \Rifgt{-1}{-2} ok\else fehler\fi\par + -2 $>$ -1 \Rifgt{-2}{-1} fehler\else ok\fi\par + + 1 $>$ 1.2 \Rifgt{1}{1.2} fehler\else ok\fi\par + 1.2 $>$ 1 \Rifgt{1.2}{1} ok\else fehler\fi\par + -1 $>$ -1.2 \Rifgt{-1}{-1.2} ok\else fehler\fi\par + -1.2 $>$ -1 \Rifgt{-1.2}{-1} fehler\else ok\fi\par + + 0.1 $>$ 0.1 \Rifgt{0.1}{0.1} fehler\else ok\fi\par + 0.1 $>$ 0.2 \Rifgt{0.1}{0.2} fehler\else ok\fi\par + 0.2 $>$ 0.1 \Rifgt{0.2}{0.1} ok\else fehler\fi\par + -0.1 $>$ -0.2 \Rifgt{-0.1}{-0.2} ok\else fehler\fi\par + -0.1 $>$ -0.1 \Rifgt{-0.1}{-0.1} fehler\else ok\fi\par + -0.2 $>$ -0.1 \Rifgt{-0.2}{-0.1} fehler\else ok\fi\par +} + +\def\testifneg{% + \message{Rifneg} + Test: Rifneg\par + 0: \Rifneg{0} fehler\else ok\fi\par + 0.5: \Rifneg{0.5} fehler\else ok\fi\par + .5: \Rifneg{.5} fehler\else ok\fi\par + 1: \Rifneg{1} fehler\else ok\fi\par + -0: \Rifneg{-0} fehler\else ok\fi\par + -0.5: \Rifneg{-0.5} ok\else fehler\fi\par + -1: \Rifneg{-1} ok\else fehler\fi\par +} + +\def\testifzero{% + \message{Rifzero} + Test: Rifzero\par + 0: \Rifzero{0} ok\else fehler\fi\par + 0.5: \Rifzero{0.5} fehler\else ok\fi\par + .5: \Rifzero{.5} fehler\else ok\fi\par + 1: \Rifzero{1} fehler\else ok\fi\par + -0: \Rifzero{-0} ok\else fehler\fi\par + -0.5: \Rifzero{-0.5} fehler\else ok\fi\par + -1: \Rifzero{-1} fehler\else ok\fi\par +} + +\def\testifpos{% + \message{Rifpos} + Test: Rifpos\par + 0: \Rifpos{0} ok\else fehler\fi\par + 0.5: \Rifpos{0.5} ok\else fehler\fi\par + .5: \Rifpos{.5} ok\else fehler\fi\par + 1: \Rifpos{1} ok\else fehler\fi\par + -0: \Rifpos{-0} ok\else fehler\fi\par + -0.5: \Rifpos{-0.5} fehler\else ok\fi\par + -1: \Rifpos{-1} fehler\else ok\fi\par +} + +\def\testifint{% + \message{Rifint} + Test: Rifint\par + 0: \Rifint{0} ok\else fehler\fi\par + -0: \Rifint{-0} ok\else fehler\fi\par + 1: \Rifint{1} ok\else fehler\fi\par + -1: \Rifint{-1} ok\else fehler\fi\par + 0.5: \Rifint{0.5} fehler\else ok\fi\par + -0.5: \Rifint{-0.5} fehler\else ok\fi\par + 1.5: \Rifint{1.5} fehler\else ok\fi\par + -1.5: \Rifint{-1.5} fehler\else ok\fi\par +} |