Fehlertolerante Kodierung von Zahlen

Hallo alle zusammen!

Kennt jemand von euch eine binäre Kodierung von Zahlen, bei der jedes Bit gleich wichtig ist (also jeder Fehler gleich schlimm)?

Hallo Ol,
ich fürchte, ich verstehe deine Frage nicht. Wenn die Anforderung ist, dass die Zahl genau wiedergegeben werden soll und nicht nur so ungefähr, dann führt jedenfalls ein fehlerhaftes Bit - egal welches - dazu, dass die Anforderung nicht erfüllt ist.
mfg SdV

Hi,

das ist bei jedem Code der Fall bei dem es keine Informationsredundanz gibt.

Informationsredundanzen können zB durch CRC hinzugefügt werden.
Auch Codes die sich die Hammingdistanz zwischen Codewörtern zunutze machen beinhalten Informationsredundanzen.

Wenn in einfachen ungesicherten Codes ein Bit kippt erhält man ein anderes gültiges Codewort wodurch die Nachricht verfälscht wird oder man erhält ein ungenutztes Codewort innerhalb des Codes womit die Nachricht nicht decodierbar ist.

MFG

Sorry, dünne Formulierungen sind eine schlechte Angewohnheit von mir.
Mir geht es (eine hochspekulative Spielerei) darum, Zellularautomaten dazu zu trainieren, Rechenoperationen auszuführen. Natürlich keine sinnvolle Anwendung (letztendlich geht es mehr um die Lösung schwammiger Probleme), aber eine, bei dem der Sollwert klar definiert ist. Die größte Fehlertoleranz hätte ich, wenn ich die kodierte Zahl als die Summe der Bits auffasse, aber das ist schon ziemlich ineffizient. Eine normale binäre Kodierung ist deshalb Blödsinn, weil ein Bitfehler an den verschiedenen Stellen enorm unterschiedlich auf die Präzision des Ergebnisses auswirkt.

Nein, und wozu?
Hi el`Ol!

Kennt jemand von euch eine binäre Kodierung von Zahlen, bei
der jedes Bit gleich wichtig ist (also jeder Fehler gleich
schlimm)?

Nein, und sowas ist auch nicht sinnvoll, für normale Anwendungen. Verbraucht nur unnötig Speicherplatz und Rechenleistung.

Die Zeiten, in denen beim Booten noch der Hauptspeicher geprüft wurde, sind lang vorbei. Heutzutage stürzt vielleicht der Rechner ab, wenn du nicht ganz passende Riegel einsteckst oder mischst. Und in jedem Fall sind Fehler in einer Zahl harmloser als im Code, wobei andererseits Codefehler häufig zum Absturz führen.

Falls du also so etwas willst, musst du m.W. selbst ein Zahlenformat kreieren, samt Rechenoperationen. Also z.B. 8 Integer, deren Summe die eigentliche Zahl ist, die aber auch einzeln gehandhabt werden. So hab ich deine Frage zumindest erahnt.

Gruß, Zoelomat

Die Berechnungen sollen von einem Zellularautomaten ausgeführt werden, der dafür „trainiert“ wird. Habe ich schon befürchtet, dass ich selbst etwas erfinden muss (oder schlimmstenfalls zum Allerineffizientesten greifen, Bits einfach addieren).

nur zum Verständnis
Hallo el’Ol,

wenn jedes Bit gleich wichtig sein soll, dann muss doch jeder Bitfehler die Zahl um den gleichen Betrag ändern. Angenommen, eine Bittkombination mit 10 Bits ergibt 0. Dann gibt es dazu 10 Variationen, die maximal 2 Zahlen zugeordnet werden müssen. Da kommst Du über die 10 Zahlen Deines Systems kaum hinaus.

Wenn Du z.B. 1-2 Zahlen Abweichung je Bit akzeptierst, kannst du Dein Verfahren Beliebig „optimieren“: jedes Bit zähle doppelt, bis auf das erste.

Mir ist auch nicht klar, ob Du nur genau einen Bitfehler zulässt, oder auch Mehrfachfehler. Oder ob es Dir doch reicht, wenn man einen Bitfehler wieder korrigieren kann.

Gruß
achim

Hallo Achim,

es geht um den mittleren Fehler, der bei einer Zufallsfolge von Bits zu erwarten ist.

Ist die Zahl einfach definiert als die Summe der Bits, ist der Fehler immer genau eins. So sklavisch will ich das gar nicht sehen, aber wenn der Fehler exponentiell ansteigt, je weiter man nach links geht, so was ist nicht akzeptabel.

1 Like

Hallo Fragewurm,

Ist die Zahl einfach definiert als die Summe der Bits, ist der
Fehler immer genau eins. So sklavisch will ich das gar nicht
sehen, aber wenn der Fehler exponentiell ansteigt, je weiter
man nach links geht, so was ist nicht akzeptabel.

Dann darfst du die Stellen nicht gewichten und musst murmeln zählen.

Also du zählst z.B. die 1er in einem Byte. allerdings kannst du dann nur die Werte 0…8 in einem Byte unterbringen.

Und wie du jetzt negative Zahlen machen willst, weiss ich auch gerade nicht?

OK, du könntest die Position gewichten.
Wenn mehr 1er auf der linken Seite sind, ist der Wert positiv, wenn die Mehrzahl rechts ist, negativ.
Macht aber Probleme bei der 8. Kippt da ein Bit liegst du um 1 daneben, aber das Vorzeichen kann sich auch ändern.
Zudem frage ich mich gerade welches Vorzeichen die 8 hat !!!

Braucht aber viel Speicherplatz.

OK, ist nur mal als Anregung gedacht.

MfG Peter(TOO)

Die Berechnungen sollen von einem Zellularautomaten ausgeführt werden, der dafür „trainiert“ wird.

Was auch immer. Auf Basis solch schwammiger Angaben samt meiner Phantasien dazu habe ich schon Angebote kalkuliert. Und war nachher glücklich, dass meine Schätzungen im Rahmen der ernstzunehmenden Alternativen war.

Ist dein Projekt denn so geheim, dass du nicht ein bisschen mehr zu den Algorithmen mitteilen kannst?

Habe ich schon befürchtet, dass ich selbst etwas erfinden muss (oder schlimmstenfalls zum Allerineffizientesten greifen, Bits einfach addieren).

Zur Effizienz des Rechnens kommt die Effizienz des Progammierens. Ein Programm wird wesentlich häufiger gelesen als geschrieben, und wenn du nicht ein Überflieger bist, der zwischen Brötchen und Kaffee/Zigarette, oder an einem Feierabend oder verlängerten Wochenende den Code mal eben reintippt, gilt dies sogar schon vor dem Zeitpunkt, an dem das Programm fertig ist.
Wenn andere dein Programm verstehen/warten/ändern sollen, gilt dies hoch irgendwas.

Und da erscheint es mir sinnvoller, die einzelnen Teile als Integer darzustellen. OK, da brauchst statt 1 Bit ein Byte, oder mehr, je nach Hardware und Programmiersprache. Dafür ist es evtll. leichter zu programmieren und zu verstehen. Und habe auch den leichten Verdacht, dass heutige Prozessoren eher darauf optmiert sind, als auf Bit-Operationen.

In Zeiten des Gigabyte-Hauptspeichers und der Terabyte-Festplatten sollte es schon sehr schlüsig begründet werden, warum man Verständlichkeit auf dem Altar des Speicherplatzes opfert. Schon zu meiner Zeit war „Performance“ nur eine leicht durchschaubare Ausrede zur Begründung unvertretbarer Schlampereien. Häufig läuft es darauf hinaus, dass 1000 Benutzer jahrelang täglich ein Programm benutzen, und die Summe aller der Optimierungen den Programmieraufwand nie erreicht…

Nimm einfach ein Array, oder eine Tabelle, oder wie auch immer genannt, von Integer-Zahlen. Da hast du immerhin für jede Einzelzahl die Werte bis 255, oder größer, oder eventuell mit Vorzeichen. All das sind keine Fragen zur Informatik, sondern zur Programmierung.

Und wenn ich richtig rate, ist der „Zufall“ dann eben nicht das Kippen eines Bits, sondern die Addition/Subtraktion von 1.

Mehr kann ich jedenfalls nicht raten.

Konkret
Hallo,

wenn der Fehler maximal 1 sein darf, kannst Du in erster Näherung 9 Zahlen mit 8 Bit darstellen.
wenn der Fehler im Mittel 1 sein darf, genauso.

Wenn der Fehler im Mittel 5 sein darf (z.B. zwischen 1 und 9), so kannst Du etwa 40 Zahlen mit 8 Bit darstellen.

Sobald Du konkrete Anforderungen für Dein System hast, kann Dir auch konkret geholfen werden.

Gruß
achim

Wie würde diese Kodierung konkret aussehen (40 Zahlen, 8 Bit, Fehler im Mittel 5)?

z.B.:

Bit Zahl
0 1
1 2
2 4
3 6
4 6
5 7
6 7
7 7

Wie würde diese Kodierung konkret aussehen (40 Zahlen, 8 Bit,
Fehler im Mittel 5)?

Vielen Dank!
Zwar sind die Bits nicht gleich wichtig, aber zumindest ist alles in der selben Größenordnung. Wie sähe der allgemeine Algorithmus zur Erstellung solcher Reihen aus?

ein zufallsansatz:

_Fehlerbereich : minimaler und maximaler Fehler eines Bits
_N : Anzahl der Bits
_i : Laufvariable

for(i=0; i

1 Like

Danke mit Sternchen!