+1 Daumen
379 Aufrufe

Um Rundungsfehler in einem Programm zu vermeiden, möchte ich Zahlen verwenden die eine möglichst kurze Nachkommastelle aufweisen. Es kommt nun auf eine einzelne Zahl an, aus der sich die übrigen ableiten. Ich habe nun herauskristallisiert an welchen Regeln man sich orientieren kann.
$$5 \lt x \lt \frac{300}{59}$$ $$\frac{x-5}{9}=a$$ $$\frac{x}{12}=b$$x, a und b müssen alle eine Zahl mit möglichst wenig Nachkommastellen erzeugen.


Ansatz:

Damit die Bedingung für a erfüllt ist, muss die eingesetzte Zahl folgendem Prinzip folgen:

$$x=5+9x_{a}$$

Wobei xa selbst eine Zahl mit endlichen Nachkommastellen sein muss.

Damit die Bedingung für b erfüllt ist, muss die eingesetzte Zahl folgendem Prinzip folgen:

$$x=3x_{b}$$

Ich löse dann beides nach x auf und setze es gleich sodass es eine Zahl weniger ist die ich suche.

$$9a+5=12b$$

Dann forme ich etwas um sodass ich nur a testen muss und an b sehe ob mir das Ergebnis gefällt. Dann würde ich eine der obigen Formeln nutzen um mein x zu ermitteln.

$$b=\frac{9a+5}{12}$$

Da eine Zahl mit endlichen Nachkommazahlen auch auf eine natürliche Zahl erweitert werden kann, suche ich nun eine natürliche Zahl a die eine natürliche Zahl b erzeugt. Hier komme ich nicht weiter und ich ahne es gibt keine solche Zahl.

Ideen?

Avatar von

2 Antworten

+1 Daumen

Hallo

 die erst Forderung sagt ja, dass x=5,0... sein muss

 dann ist etwa mit x= 5,018  a=0,002 , statt der 18 jede durch 9 teilbare Zahl unter 300/59. dann ist aber x nicht durch 3 tb also  x/12 eine periodische Zahl, also bring deinem Programm bei periodisch Zahlen mit einfacher Periode zu erkennen?

2/12=1,6666...

alles ohne Periode kriegst du sicher nicht hin!

Gruß lul

Avatar von 106 k 🚀
+1 Daumen

Das Wort "Rundungsfehler" ist genau das richtige Stichwort!

Da kein Rechner der Welt unendlich genau mit dezimalen Nachkommazahlen rechnet

und es ohne "Bruchschreibweise" keine exakte Lösung gibt,

kann man zunächst die Genauigkeit vorgeben: 99% der Programme rechnen mit double,

was etwa 15 Nachkommastellen entspricht.

Wenn man Iterativ den Mittelwert aus den beiden gerundeten Werten bildet

und dann iterativ zurückrechnet und den neuen Wert immer wieder in diese Iteration neu einrechnet,

stellt sich nach etwa 46 Iterationen ein Gleichgewicht ein, wo es trotz Rundung und trotz

"keine perfekte Bruchrechnung" bei Rückrechnung wieder der selbe Wert für x herauskommt.

Per Iterationsrechner mit Startvorgabe aB[0]=5.03 (was Deinem x entspricht):

http://www.gerdlamprecht.de/Roemisch_JAVA.htm##@N@B0]=5.03;@C0]=(@B0]-5)/9;aD[0]=@B0]/12;a=1e5;@N@Bi+1]=(floor(aD[i]*12*a)/a+floor((@Ci]*9+5)*a)/a+@Bi]*3)/5;@Ci+1]=(@Bi+1]-5)/9;aD[i+1]=@Bi+1]/12;@Ni%3E58@N0@N1@Nb=aD[i-1]*12;c=@Ci-1]*9+5;

ergibt das online

ItDoubleRundungRueckrechnung.png

Eingeschwungenes aB[48]=5.02999 ist also Dein gesuchtes x

Die abschließende Rückrechnung zu x mit beiden Rückrechnungs-Wegen:

a) aus aD[48] (was Dein b entspricht) in Variable b

b) aus aC[48] (was Dein a entspricht) in Variable c

ergibt dann den selben Ausgangswert (für Dein x) ohne Rundungsfehler!

2 weitere Beispiele für die 3  eingeschwungen Variablen:

 5.0397                  0.004411111111111094    0.419975

 5.04969                0.005521111111111112    0.4208075

Avatar von 5,7 k

Das ist ja ein erstaunliches Werkzeug, danke! Das hilft mir weiter.

Ich werde zusätzlich schauen Festkommazahlen zu implementieren, das sollte auch einiges bewirken.

Grüße

Danke für die schnelle Reaktion.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community