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.
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.
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.
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.
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.
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.
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?
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); |
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.