Wobei Du bei Double abgerundet hast.cloidnerux hat geschrieben:Float: 0,0244% Abweichung
Double: 0% Abweichung
Das schöne an dieser Aufgabe ist, dass ein Computer sie nicht ausrechnen kann, denn egal welches Primitiv man nimmt, das Ergebnis wird niemals 1000 sein.
Obwohl 1000 offensichtlich ist, ist es das Ergebnis, das definitiv nie raus kommt
0.5% ist natürlich schon sehr drastisch.fat-lobyte hat geschrieben:Ok, ist doch ein bisschen viel...Xin hat geschrieben:Öhm.... ich hantiere hier mit recht kleinen Zahlen und Du schätzt den Fehler bei 0,5% Prozent?
Wieso nennt man Computer dann Rechner und nicht Verrechner? ^^
20fach zuviel. Ich würde trotzdem sagen, dass das schon recht gut geschätzt ist.
0.5% werden nämlich auch schnell recht deutlich zu optimistisch. Drei Dezimalstellen mehr und Du hast 25%.
Wenn Du 666666.5 von 666666.6 abziehst und mit 10000 multiplizierst kommt 1250 raus.
Von daher ist die Abschätzung wirklich nicht schlecht.
Kommt drauf an, was man rechnet.fat-lobyte hat geschrieben:Schneller schon, aber ich könnte mir vorstellen, dass letzteres numerisch stabiler ist. Wenn ich das richtig verstanden habe, geht genauigkeit dann verloren, wenn man mit Zahlen sehr unterschiedlicher Größenordnung rechnet. 0.1 und 10 000 klingt sehr unterschiedlich, 666,6 und 10 000 klingt weniger unterschiedlich. Wenn ich so drüber nachdenke, dann hab ich wahrscheinlich was missverstanden.Xin hat geschrieben:Was ist wohl schneller ausgerechnet?fat-lobyte hat geschrieben:Aber wenn man zuerst die Differenz bilded und dann erst multipliziert, ist man selber schuld, wenn einem die Genauigkeit nicht passt.
(666.6 - 666.5) * 10000
oder
666.6 * 10000 - 666.5 * 10000?
Der Fehler beginnt damit, dass der Computer 0.1 nicht korrekt speichern kann. Mit 666.6 bin ich 0.1 über 666.5, die exakt speicherbar ist. (2^-1 => 0.5). Mit der 666.5 verstopfe ich die Mantisse, damit geht die Genauigkeit für die dahinterliegenden 0.1 flöten. Anschließend nehme ich die 666.5 wieder aus der Mantisse raus, die ungenauen 0.1 bleiben also übrig. Die hat zwar nun die komplette Mantisse frei, aber sie bleibt ungenau.
Der Moment, in dem die Zahl 666.6 gespeichert wird, bedeutet schon das Ende eines brauchbaren Ergebnisses.
Das gilt für Float, genauso wie für double (oder auch int), denn 0.1 ist im 2er Zahlensystem nicht mit endlichen Bits repräsentierbar, vergleichbar mit der Zahl Pi im Zehnerzahlensystem.
Durch die Subtraktion wird die Zahl kleiner, doch absolute Fehler bleibt hier identisch! Damit steigt jedoch der relative Fehler entsprechend drastisch an. Mit der Multiplikation um 10000 ändere ich den relativen Fehler (0.0244%) nicht mehr, aber der absolute Fehler steigt entsprechend, dass man sich fragt, was man mit der Zahl überhaupt noch anfangen soll.
Dieser Thread nur ins Gedächtnis rufen, wie schnell man etwas berechnet hat und wie schnell eine einfache Rechnung einfach nur vollkommen falsch sein kann.
PS:
Wenn Du die Multiplikation wie von Dir vorgeschlagen durchführst, dann kommt 1000.0 raus. Aber die Zahlen sollten nicht wirklich größer werden. ^^
10000 ist keine glatte Zahl im Binärsystem, aber eine sehr große (12 Stellen?) - hier wird das Binärmuster von 666.6 also entsprechend wieder ausgedehnt, so dass die Rundungsfehler komplett aus der Mantisse verdrängt werden.