Biquinäre Irrwege - Biquinary or the quirky history of programmable calculating machines

in #deutsch2 years ago (edited)

Biquinäre Irrwege

Biquinary or the quirky history of programmable calculating machines

English summary below

Ehrlich gesagt habe ich den Schritt vom Rechner zur Datenverarbeitung auch nie ganz verstanden, wo doch Datenverarbeitung so viel praktischer ist als irgendwelchen faden arithmetischen Rechnereien doch dann fand ich plötzliches jenes Video über den FACOM 128 auf Youtube.

Der FACOM 128 war ein kommerzieller Relaisrechner und außer dass er ziemlich laut und a*langsam war scheint einem nichts mehr dazu einzufallen. HALT!!! wenn man etwas weiter gräbt stößt man eben auf biquinäre Codierung.

biquinary abacus

Quasi eine Codierung wie bei einem Abakus. Die oberen Perlen bzw. Bits sind für 5 und 0 und die unter 5 Perlen bzw. Bits sind für 4, 3, 2, 1, 0. Für jede von zehn möglichen Zahlen von 0 bis 9 müssen je zwei Bits gesetzt sein, sonst ist das ganze falsch.

Somit verbraucht eine Dezimalzahl mehr als doppelt so viel Speicherplatz, nämlich 7 statt rund 3,33 Bits.

Bescheuert oder genial ?

Auf den ersten Blick und wenn man von dem was wir heute kennen waren diese frühen oder ersten programmierbaren Rechenmaschinen einfach nur bescheuert.

Sowas wie RAM oder Speicher gabs nicht wirklich und der FACOM 128 hatte wie viele andere Relaisrechner auch einfach nur ca. 180 Register die eben 69 Bits oder besser gesagt ca. 180 Gleitkommazahlen speichern konnten. Das man mit den rund 13 000 Bits weit mehr hätte anfangen können ist natürlich offensichtlich.

Dennoch gibts zwei Gründe, die für biquinär sprechen.

Erstens sind die Menschen seit Jahrhunderten das Dezimalsystem gewöhnt und der biquinäre Code ist viel fehlerresistenter als der binäre Code, der dafür weit speicherschonender ist.

Zweitens lässt sich angeblich ein biquinäres Addierwerk nur mithilfe einer Und-Oder-Matrix realisieren und diese braucht angeblich weit weniger Relais bzw. später dann auch Röhren als ein binärer Addierer.

Computer brauchen eigentlich gar keine Addierer und eine binäre Addition lässt ich bequem durch
XOR , AND und Left-Shift realisieren bzw. auch ganz einfach durch Zeichenkettenersetzung(siehe meine Artikel über die Turingmaschine,Thue usw.).

Aus Mathematics and Computers von George Stibitz habe ich dann doch eine Schema für ein biquinäres Addierwerk gefunden. Ist wohl offensichtlich, das hier nur die Addition zweier Dezimalstellen samt Übertrag gezeigt wird.

biquinarycalc.gif

summary

Actually for centuries bored human mathematicians and humans abused as calculating machines dreamed of machines that could perform their tedious arithmetical labour. For unknown reasons Indians, Arabs, Europeans etc. favored the decimal system.

From an early abacus it can be seen that ten pearls can be reduced to seven and that is the birth of biquinary. The upper pearls stand for five and the lower pearls for one. However the biquinary in early programmable calculating machines which used electromechanical switches used that for error checking as the whole thing was quite buggy or fragile and finding broken switches was something which could happen.

As both relais and vacuum tubes were both quite unreliable and quite costly the usage of an And-Or-Matrix seemed to be quite tempting as that could reduce the number of switching elements. However for us who grew up with 8-bit, then 16-bit, then 32-bit and now 64-bit processors and architecture such an early supposed waste seems to be quite dumb. Nevertheless the FACOM 128 was a commercial Japanese Relais Computer with 69-bit biquinary floating point architecture.

Special Bonus

For those who are still curious and want to play a little with biquinary I wrote a small Biquinary Adder with HTML, CSS and Javascript which you can run in your browser. I did not check if the program has any errors nor has the program any checks for input errors.

Have fun with it !

       <html>
<style>
.true{
 //border-color: black;
 background-color: orange;
}
.false{
 //border-color: black;
 background-color: lightgrey;

}
</style>
<body>
<script>
var al0=al1=al2=al3=al4=aln=alv=false;
var bl0=bl1=bl2=bl3=bl4=bln=blv=false;
var rl0=rl1=rl2=rl3=rl4=rln=rlv=false;
</script>
<h1>Biquinary Adder</h1>
<p>
 alv<input type="checkbox" onclick="alv=!alv;">
 aln<input type="checkbox" onclick="aln=!aln;">
 &nbsp;&nbsp;&nbsp;
 al4<input type="checkbox" onclick="al4=!al4;">
 al3<input type="checkbox" onclick="al3=!al3;">
 al2<input type="checkbox" onclick="al2=!al2;">
 al1<input type="checkbox" onclick="al1=!al1;">
 al0<input type="checkbox" onclick="al0=!al0;">
</p>
<p>
 blv<input type="checkbox" onclick="blv=!blv;">
 bln<input type="checkbox" onclick="bln=!aln;">
 &nbsp;&nbsp;&nbsp;
 bl4<input type="checkbox" onclick="bl4=!bl4;">
 bl3<input type="checkbox" onclick="bl3=!bl3;">
 bl2<input type="checkbox" onclick="bl2=!bl2;">
 bl1<input type="checkbox" onclick="bl1=!bl1;">
 bl0<input type="checkbox" onclick="bl0=!bl0;">
</p>
<button onclick="doAdd();showRes();">calc</button>
<p id="result">
         <span class="false">.</span>
         <span class="false">.</span>
         <span class="false">.</span>
         <span class="false">.</span>
         <span class="false">.</span>
         <span class="false">.</span>
         <span class="false">.</span>
</p>
<script>
function doAdd(){
 rl0=(al0&&bl0)||(al1&&bl4)||(al2&&bl3)||(al3&&bl2)||(al4&&bl1);
 rl1=(al0&&bl1)||(al1&&bl0)||(al2&&bl4)||(al3&&bl3)||(al4&&bl2);
 rl2=(al0&&bl2)||(al1&&bl1)||(al2&&bl0)||(al3&&bl4)||(al4&&bl3);
 rl3=(al0&&bl3)||(al1&&bl2)||(al2&&bl1)||(al3&&bl0)||(al4&&bl4);
 rl4=(al0&&bl4)||(al1&&bl3)||(al2&&bl2)||(al3&&bl1);
 rln=(al0&&bl0)||(al1&&bl0)||(al2&&bl0)||(al3&&bl0)||(al4&&bl0);
 rln=rln||(al0&&bl1)||(al1&&bl1)||(al2&&bl1)||(al3&&bl1);
 rln=rln||(al0&&bl2)||(al1&&bl2)||(al2&&bl2);
 rln=rln||(al0&&bl3)||(al1&&bl3);
 rln=rln||(al0&&bl4);
 rlv=(al1&&bl4)||(al2&&bl4)||(al3&&bl4)||(al4&&bl4);
 rlv=rlv||(al2&&bl3)||(al3&&bl3)||(al4&&bl3);
 rlv=rlv||(al3&&bl2)||(al4&&bl2);
 rlv=rlv||(al4&&bl1);
 rlv=rlv||(alv&&bln)||(aln&&blv);
 rln=rln||(alv&&blv);

}

function cx(v){
 if(v){return 'true';}
 else{return 'false';}
}

function showRes(){
 var res=document.getElementById('result');
 res.innerHTML= `<span class="${cx(rlv)}">.</span>
         <span class="${cx(rln)}">.</span>
         <span class="${cx(rl4)}">.</span>
         <span class="${cx(rl3)}">.</span>
         <span class="${cx(rl2)}">.</span>
         <span class="${cx(rl1)}">.</span>
         <span class="${cx(rl0)}">.</span>`;
}

</script>
</body>
</html>