Forum: Compiler & IDEs Dezimalbruch in Binärbruch umwandeln


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

oft ist es auf einer kleinen Plattform (AVR) nützlich, eine 
Multiplikation mit einem konstanten Dezimalbruch durch eine 
Multiplikation mit einem Int und eine Division durch einen Wert 2^n zu 
ersetzten. So ist z.B.

b = a*0.22

ungefähr

b = a*7/32

mit immerhin 0,6% Genauigkeit. So weit die allgemeinbekannten Tatsachen.

Nur: Gibt es für diese Ersetzung eine feststehende Bezeichnung? Einen 
technischen Fachausdruck?

Viele Grüße
W.T.

von Mario (Gast)


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Nur: Gibt es für diese Ersetzung

Es ist keine "Ersetzung" sondern eine Näherung.

"Näherung durch eine endlichen / abbrechende Binärentwicklung" kann man 
sagen.

Es beruht darauf, dass die Menge der Zahlen z/2^n mit n in N und z ganze 
Zahl dicht sind in den reellen Zalhen, d.h. für jede reelle Zahl r gibt 
es eine Folge aus solchen Zahlen, die gegen r konvergiert.  Die Folge 
ist nicht eindeutig.

von Doktor Nahtlos (Gast)


Lesenswert?

Johann L. schrieb:
> ...dass die Menge der Zahlen z/2^n mit n in N und z ganze
> Zahl dicht sind in den reellen Zalhen, d.h. für jede reelle Zahl r gibt
> es eine Folge aus solchen Zahlen, die gegen r konvergiert.  Die Folge
> ist nicht eindeutig.

Diese Antwort auch nicht.

von Karl M. (Gast)


Lesenswert?

Johann L. beschreibt das Problem des TE schon korrekt. :-)

Wenn man kein Mathematiker ist, dann kann man diese Art von 
Formulierungen nicht (leicht) verstehen.
Und auf die richtigen Schlussfolgerungen kommt man dann auch nicht so 
einfach.

von Walter T. (nicolas)


Lesenswert?

Daß es sich um eine Näherung handelt, hatte ich auch als bekannt 
vorausgesetzt. Und die meisten Näherungen haben einen Namen. Die 
bekannteste Näherung dürfte wohl die Taylor-Reihe mit Abbruch nach dem 
n-ten Glied sein.

Und ich suche nur den Namen für die "Näherung einer Multiplikation mit 
einem konstanten Dezimalwert durch Multiplikation mit einem Ganzzahligen 
Wert und Division durch eine Zweierpotenz".

Ich vermute, es gibt dafür eine kürzere Bezeichnung.

von Poster (Gast)


Lesenswert?

NeMmekDdMmeGWuDdeZ

ist doch schön kurz :)

von rmu (Gast)


Lesenswert?

Walter T. schrieb:
> So ist z.B.
>
> b = a*0.22
>
> ungefähr
>
> b = a*7/32
>
> mit immerhin 0,6% Genauigkeit. So weit die allgemeinbekannten Tatsachen.
>
> Nur: Gibt es für diese Ersetzung eine feststehende Bezeichnung? Einen
> technischen Fachausdruck?

0.22 wird vom compiler ja auch in einen "binärbruch" (+exponent) 
umgewandelt, nur halt in einen genaueren.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Walter T. schrieb:
> "Näherung einer Multiplikation mit einem konstanten Dezimalwert
> durch Multiplikation mit einem Ganzzahligen Wert und Division
> durch eine Zweierpotenz".

Dass mit einem konstanten Dezimalwert (bei dir "x") multipliziert wird 
spielt dich keine Rolle?

Es geht doch i.W. um eine Näherung (bei dir eine für 0.22), und was 
danach geschieht ist doch Wurst.  Oder geht die Tatsache, dass hernach 
multipliziert wird, in die Gestalt der Näherung ein?  Und ob x bekannt 
ist oder nicht oder konstant spielt doch auch keine Rolle?

von Walter T. (nicolas)


Lesenswert?

Johann L. schrieb:
> Dass mit einem konstanten Dezimalwert (bei dir "x") multipliziert wird
> spielt dich keine Rolle?

In diesem Fall geht es tatsächlich um die Multiplikation mit einer 
Konstanten. Ich suche einfach nach Vokabeln, die den Sachverhalt 
beschreiben. Ich bin der Meinung, daß meine Programme dadurch besser 
werden, daß ich mehr Vokabeln lerne.

Beispiel:
1
A = readbitmap(infilename);
2
A = scaleBitmapFrom0To255To0To1(A);
3
B = proceedBitmap(A);
4
B = scaleBitmapFrom0To1To0To255(B);
5
writebitmap(B,outfilename);

Und jetzt die Variante, wo der Autor nur eine Vokabel mehr kennt:
1
A = readbitmap(infilename);
2
A = normalizeBitmap(A);
3
B = proceedBitmap(A);
4
B = denormalizeBitmap(B);
5
writebitmap(B,outfilename);

von W.A. (Gast)


Lesenswert?

Walter T. schrieb:
> Ich suche einfach nach Vokabeln, die den Sachverhalt beschreiben.

Vokabeln brauchst du, wenn du dich mit anderen darüber unterhalten 
möchtest.

> Ich bin der Meinung, daß meine Programme dadurch besser
> werden, daß ich mehr Vokabeln lerne.

Programme werden durch algorithmisches Denken und klare Strukturen 
besser.

von Rolf M. (rmagnus)


Lesenswert?

W.A. schrieb:
>> Ich bin der Meinung, daß meine Programme dadurch besser
>> werden, daß ich mehr Vokabeln lerne.
>
> Programme werden durch algorithmisches Denken und klare Strukturen
> besser.

Naja, aussagekräftige Namen machen das Programm vielleicht nicht im 
Bezug auf die Funktionalität besser, aber im Bezug auf die Lesbarkeit 
und Wartbarkeit des Code schon.

von Jan H. (j_hansen)


Lesenswert?

W.A. schrieb:
> Vokabeln brauchst du, wenn du dich mit anderen darüber unterhalten
> möchtest.

Auch (wie zum Beispiel hier im Forum), aber nicht nur.

> Programme werden durch algorithmisches Denken und klare Strukturen
> besser.

Dadurch auch, aber nicht nur. Dein Kommentar hat wenig mit dem Thema zu 
tun.

Es gibt ja auch den schönen Spruch: "There are only two hard things in 
Computer Science: cache invalidation and naming things." Daher finde ich 
die Frage berechtigt.

von Jay (Gast)


Lesenswert?

Das Vorgehen allgemein (ob exklusiv mit Zweierpotenzen im Nenner oder 
beliebigen Nennern) wird Skalierung, bzw. in der englischen Computerei 
Scaling, genannt. Denn nichts andere ist es. In zumindest einer 
exotischen Programmiersprache wird es im Slang auch star-slash operation 
genannt.

Der Bruch ist ein Näherungsbruch. Am besten, wenn man Glück hat und es 
einen gibt, ein kanonischer Näherungsbruch, ausgewählt aus den 
kanonischen Näherungsbrüchen der zu approximierenden Zahl, mit der 
größten Zweierpotenz im Nenner, für den sowohl Zähler als auch Nenner 
noch im Wertebereich des verwendeten Integer-Datentyps liegen und die 
Multiplikation des Zählers mit den erwarteten zu skalierenden Werten 
keinen internen Überlauf ergibt.

Einen speziellen Namen hat die Wahl eines (kanonischen) Näherungsbruchs 
der eine Zweierpotenzen im Nenner hat meines Wissens nicht.

von tictactoe (Gast)


Lesenswert?

Walter T. schrieb:
> So ist z.B.
>
> b = a*0.22
>
> ungefähr
>
> b = a*7/32
>
> mit immerhin 0,6% Genauigkeit. So weit die allgemeinbekannten Tatsachen.
>
> Nur: Gibt es für diese Ersetzung eine feststehende Bezeichnung? Einen
> technischen Fachausdruck?

Nimm mal an, in Wirklichkeit wäre eigentlich die Multiplikation mit dem 
Wert von 2/9 gedacht gewesen. Nur war der Programmierer faul und hat nur 
näherungsweise 0.22 hingeschrieben (oder die Näherung war ausreichend).

Diese Näherung könnte man im Dezimalsystem auch als 22/100 schreiben.

Genau so gut könntest du sie im Binärsystem auch als 0b111/0b100000 
schreiben.

Vielleicht hilft dir diese Analogie auf die Sprünge.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.