% Leserbrief Alber Nijhof
% Content-Encoding: UTF-8

\section{Die Russische--Bauern--Multiplikation}

Zu „Die Russische--Bauern--Multiplikation‟ von Fred Behringer (VD 3/4--2005, S.7--11)

Hallo Fred,

In deinem Artikel über das russische Malnehmen schreibst du: „Es ist mir leider nicht gelungen, in High--Level--Forth einen doppeltgenauen Überlaufschutz bei der Addition zweier vierfachgenauen Zahlen zu verwirklichen. Also konnte ich \verb|Q+| nicht aus schon bestehenden \verb|D+|--Anteilen zusammensetzen.‟

Zugegeben, es ist nicht von übergroßer Bedeutung, aber du kannst ein Carry allein durch Zusammenzählen erzeugen, ohne dabei Maschinencode zu verwenden.

\begin{verbatim}
: +CARRY  ( x y -- z carry )     0 TUCK D+ ;

: D+CARRY ( dx dy -- dz carry )
  ROT 2>R           \ xlo ylo     \r: yhi xhi
  +CARRY 0
  2R> +CARRY
  D+ ;
\end{verbatim}

Hast du erst einmal \verb|D+CARRY|, dann hast du auch \verb|Q+|:

\begin{verbatim}
: Q+ ( qx qy -- qz ) 
  2>R 2SWAP 2>R D+CARRY 0 2R> D+ 2R> D+ ;
\end{verbatim}

Könntest du bitte selbst nachprüfen, ob sich kein Fehler eingeschlichen hat? Ich habe nicht allzu lange darüber nachgedacht, da ich diese Zeilen gern noch in dem vom FG--Direktorium gerade bearbeiteten VD--Heft 1/2006 veröffentlicht sehen wollte.

De hartelijke groeten,\\
\hspace*{\fill} Albert

\hbox to \hsize{\hss\hbox to 10em{\leaders\hrule width 10em height 0.5pt\hfill}\hss}

\subsection{Antwort von Fred Behringer}

Hallo Albert,

vielen Dank für deine Bemerkungen. Es geht tatsächlich (alles in High--Level--Forth). Nebenbei gesagt, du kennst meine Einstellung: Ich verwende gern Forth--Assembler als (mir) leicht zugängigen Allerweltsassembler und High--Level--Forth als leicht programmierbaren Organisator, der die eigentlich interessanten Assembler--Teile zusammenhält. Dabei befinde ich mich im Gleichklang mit beispielsweise Julian Noble \verb|<jvn@virginia.edu>|: „Ein Assembl(i)eraufruf‟, VD 2/2002, s.19--24. Julian schreibt: 

„Was tun aber die Mitglieder der Forth--Gemeinde in allererster Linie (wenn sie nicht gerade in Forth programmieren)? Sie versuchen, die anderen Programmierer, die immer noch mit Sprachen geringerer Qualität herumwursteln, zu Forth umzuerziehen. Schon seit langem bin ich zu der Überzeugung gelangt, dass wir bei unseren Bekehrungsversuchen eine ganze Menge verschenken, indem wir viel zu stark die Vorzüge des High--Level--Teils von Forth anpreisen, seine Erweiterbarkeit, die Abstraktionskraft, die Einfachheit, die Eleganz und so weiter und so fort. Ich denke heute, es wäre wohl besser, Forth dem ungläubig Außenstehenden über den Assembler näherzubringen.‟

Gut, dass du mir den Anstoß gegeben hast, alles noch einmal zu überprüfen: Bei \verb|2AND| habe ich zu schnell überlegt. Man könnte bei \verb|2AND| als Ergebnis einen doppeltgenauen Wert vermuten. Er ist bei mir aber nur einfachgenau --- und sollte auch nur einfachgenau sein. Es wäre wohl besser gewesen, eine dem Umstand angemessene neue Bezeichnung einzuführen. Es ist im Artikel an dieser Stelle nichts falsch, aber man führe vielleicht doch besser folgende Ersetzungen ein:

\begin{verbatim}
\ : 2AND ROT AND -ROT AND OR ;
: D-UNGERADE? DROP 1 AND 0<> ;

\ B 2@ 1. 2AND IF C 4@ A 4@ Q+ C 4! THEN
  B 2@ D-UNGERADE? IF C 4@ A 4@ Q+ C 4! THEN
\end{verbatim}

(Bei \verb|D-UNGERADE?| steht \verb|0<>| eigentlich nur der Schönheit wegen da.)

Und noch eine Warnung: Wenn man die Eingaben dezimal macht, könnte man bei höheren Werten meinen, die Ergebnisse seien falsch. Sind sie nicht! In Bezug auf die Aufteilung nach höherwertigem und geringerwertigem Anteil ist das Dezimalsystem mit dem Hexadezimalsystem nicht kompatibel: Man kann nicht einfach sagen, der höherwertige Dezimalanteil entspricht nach Umwandlung genau dem höherwertigen Hexadezimalanteil. Die {\em Schnittstellen} der Stellenwertsysteme müssen übereinstimmen. Bei Binär-- und Hexadezimalsystem geht's.

Zur Umgehung dieser Schwierigkeit bei gleichzeitiger Überprüfung deines Forth-Wortes \verb|Q+| mit allergrößten Dezimaleingaben kann man Folgendes machen:

\begin{verbatim}
65535 65535 65535 65535 UD*Q^^ [ret]
65535 65535     0     0 Q+     [ret]
65535 65535     0     0 Q+     [ret]
\end{verbatim}
Ergebnis:

\verb|65535 65535 65535 65535|

Das kann man {\em im Kopf} nachrechnen und sofort bestätigen.

Herzlichen Gruß\\
\hspace*{\fill} Fred


