Gleitkommapräzision gegenüber Kunden erklären [closed]

23

Wie lässt sich das Problem der Gleitkomma-Rundung den Kunden am besten erklären ?

Ich kenne

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

Wie auch die Einträge in den C ++ - FAQ und verschiedenen anderen Seiten, die sich an Entwickler und Wissenschaftler richten. Gibt es jedoch eine Webseite, einen Artikel oder eine Erklärung, die sich an "Stammkunden" mit begrenztem mathematischem oder wissenschaftlichem Hintergrund richtet? (für die die obigen Referenzen flach fallen).

Wenn es von einer bekannten und anerkannten Institution oder Firma gepflegt wurde oder stammt, kann es, wie einige von Ihnen vielleicht erlebt haben, etwas kompliziert sein, dies selbst zu erklären.

Eric Grange
quelle
1
Ich würde mich nicht darum kümmern ...
John Shaft
1
Das ist eine wirklich fantastische Frage, +10 wenn ich könnte. Ein häufiges Problem für Entwickler.
Cody Grey
2
Es ist kein Detailproblem, sondern es antwortet, z. B., warum das Addieren von Zahlen mit einer Genauigkeit von 2 Dezimalstellen einen Wert von 5,9999999 und keine 6 ergibt und warum Sie eine Rundungsgenauigkeit angeben müssen, wenn das Ergebnis "offensichtlich" ist. Es darf nicht mehr als zwei Dezimalstellen geben. Oder warum 2 minus 2 manchmal nicht immer Null ist und dabei nicht wie ein Idiot aussieht.
Eric Grange
9
@Eric Grange: Wenn Ihre Kunden diese Präzisionsprobleme als Fehler betrachten, handelt es sich um einen Fehler, und Sie müssen einen Weg finden, ihn zu beheben (möglicherweise, indem Sie float nicht verwenden). Sie kümmern sich nicht darum, woher dieses Präzisionsproblem kommt. Sie kümmern sich nicht darum, wie Ihre Software funktioniert. Sie wollen nur, dass es funktioniert.
David
3
@Eric: Die Verwendung von Gleitkommazahlen ist ein Implementierungsdetail. Ich wiederhole meine Frage, die nach einer Erklärung in der Frage fragt und die ich offenbar nicht klargestellt habe (entschuldige mich): Was ist der Kontext und warum diskutieren Sie mit einem Kunden über die Verwendung von Gleitkommazahlen?
Tom Anderson

Antworten:

8

Ich finde einen einfachen Weg dies zu erklären, indem ich es demonstriere . Besprechen Sie, wie Sie xdurch eine Zahl dividiert und dann mit derselben Zahl multipliziert werden sollten. Lassen Sie xden Kunden zustimmen, dass dies immer der Fall sein sollte. Dann mach das Alte (100 / 3) * 3auf einem Taschenrechner; Zeigen Sie, dass der Wert nicht wie erwartet zu 100 zurückkehrt. Wenn die meisten Leute scheinbar einfache Mathematik "zusammenbrechen" sehen, dann neigen Sie dazu, die Gefahr von Gleitkommazahlen zu "bekommen", bei denen Genauigkeit wichtig ist (obwohl dies intuitiv ist nicht auf die niedrige Ebene, in die der Artikel geht, auf den Sie verweisen).

Leider sind die meisten halbwegs vernünftigen Taschenrechner (mit Sicherheit alle wissenschaftlichen, die ich gesehen habe, und nicht nur einige grundlegende) heutzutage in der Lage, damit umzugehen - ich nehme an, sie speichern zusätzliche Ziffern, die über das hinausgehen, was angezeigt und gerundet werden kann - und tun dies auch Prüfen Sie, wie clever Ihr Rechner ist, bevor Sie ihn Ihrem Kunden vorführen.

Scott
quelle
1
Ja, fast alle Taschenrechner speichern mindestens 2 zusätzliche Stellen, daher müssen Sie ein paar Multiplikatoren in die Mischung einfügen, was die Erklärung trübt, und IME lässt sie glauben, Sie würden versuchen, sie zu täuschen. Quadratwurzel erfordert weniger Operationen, aber Quadratwurzel ist bereits außerhalb des Alltagsbereichs der Stammkunden.
Eric Grange
2
@Scott Ich habe hier ein paar Taschenrechner ausprobiert, keiner zeigte Probleme mit (100/3) * 3, sogar (100/3) * 3-100 zeigte keine Probleme .... Excel macht es auch richtig.
Eric Grange
9
Nehmen wir als Beispiel Geld, das eine perfekt begrenzte Präzision hat. Erklären Sie, Sie teilen einen Dollar auf, dann bekommt jede Person 33 Cent und ein Cent geht beim Runden verloren. Damit kann sich jeder identifizieren.
Inca
4
Kümmere dich nicht um den Taschenrechner. Teilen Sie 1 durch 3 auf dem Papier, wobei Sie drei signifikante Ziffern beibehalten.
David Thornley
5
@omegacentauri Wenn Sie der Meinung sind, dass diese Erklärung hilfreich ist, sprechen Sie wahrscheinlich nicht oft mit Kunden.
jhocking
5

Ich glaube nicht, dass es Abkürzungen gibt. Sie müssen entweder:

  • Verstehe, was Fließkomma ist und wie es sich verhält.

Oder, wenn das zu viel verlangt wird, muss man einfach:

  • Akzeptieren Sie, dass der Computer keine genauen numerischen Ergebnisse liefert.

Vielleicht hilft ein Beispiel mit irrationalen Zahlen (auch wenn Gleitkomma - Fragen im Zusammenhang mit rationalen Zahlen gelten auch): sqrt(2) ~ 1.414. Dann 1.414^2 = 1.999396. Egal wie viele Ziffern Sie verwenden, Sie werden nie ganz zum Original zurückkehren 2. Okay, 4 korrekte signifikante Stellen mögen akzeptabel sein, aber überlegen Sie, was passiert, wenn sich diese Art von "Rundungsfehlern" ansammeln. Hier liegt die wahre Gefahr.

Joonas Pulakka
quelle
2
Ich persönlich kenne und verstehe, aber für manche Menschen ist "Fließkomma" bereits ein Fremdwort. Sie brauchen also mehr als mathematische oder wissenschaftliche Erklärungen, um zu erklären, dass das, was sie direkt im Kopf berechnen können, ihre teuren Computer und Software Probleme haben, das Richtige zu finden ;) Auch die Quadratwurzel gehört nicht zum Alltag der Stammkunden.
Eric Grange
5

Bestimmen Sie zunächst, worüber sie sich beschweren. Finanztransaktionen müssen präzise durchgeführt werden, mit der richtigen Anzahl von Dezimalstellen und den richtigen Rundungsregeln. Dies bedeutet in der Regel, dass eine ganzzahlige Anzahl von Währungseinheiten beibehalten und sichergestellt wird, dass die Arithmetik korrekt ausgeführt wird.

Alternativ beschweren sie sich möglicherweise über übergenaue Anzeigen, und die Reduzierung der Anzahl der ausgegebenen signifikanten Stellen kann alles sein, was erforderlich ist.

Für Zahlen im Allgemeinen können Sie immer versuchen, eine dreistellige Dezimalzahl x zu finden, sodass x * 3 10 ist. Dies zeigt die Grundprinzipien.

Es gibt zwei verbleibende Probleme. Zum einen können bestimmte Zahlen genau dezimal, aber nicht binär ausgedrückt werden (z. B. 3,15). Es wird schwierig sein, dies nicht-technischen Leuten zu erklären, und Sie sollten versuchen, dies zu vermeiden, indem Sie nicht genügend signifikante Ziffern bereitstellen, damit es angezeigt wird. Der andere ist der Kunde, der ein wenig weiß, genug, um zu wissen, dass Computerarithmetik nicht immer genau ist und nicht genug, um zu erkennen, dass Dezimalarithmetik nicht immer genau ist. Ich habe mich mit einigen von ihnen gestritten und nichts Nützliches zu berichten.

David Thornley
quelle
3

Gleitkommazahlen in Computern verwenden Binärzahlen. So wie wir ein Zahlensystem mit Einsen, Zehnern, Hunderten und Zehnteln, Hundertsteln haben, haben Gleitkommazahlen in Computern tatsächlich Einsen, Zweien, Vieren und Hälften, Viertel und Achtel Spalten. Wenn der Kunde mit Fuß / Zoll vertraut ist, erinnern Sie ihn daran, wie Sie normalerweise Basis-2-Bruchteile eines Zolls für die Messung verwenden.

Versuchen Sie nun, 10 Cent als Kombination von Hälften, Vierteln und Achteln eines Dollars zu speichern. Es funktioniert einfach nicht:

.00011001100110011. . . ( wiederholt sich unendlich )

Es ist dasselbe, als würde man ein normales imperiales Maßband nehmen und versuchen, einen Zehntel Zoll zu messen. Sie können es nicht genau machen. Es gibt keine Darstellung von 1/10 als X / Y, wobei X und Y ganze Zahlen sind und Y eine Potenz von 2 ist.

Aus diesem Grund gibt es die dezimalen Datentypen, bei denen jede Dezimalstelle mit 4 Bits gespeichert wird. Daher kehren wir zur Darstellung der Basis 10 zurück. Der Kompromiss ist in Raum und Leistung (nach dem, was ich gelesen habe, ein Performance-Hit von ungefähr 100%).

Scott Whitlock
quelle
1

Sagen Sie ihnen, dass der Computer eine Zahl nicht einfach mit willkürlicher Genauigkeit speichern kann, so wie ihr Bankkonto nicht 4.4423425908459032890413 ... Dollar halten kann (entweder $ 4.44 oder $ 4.45, nichts dazwischen). Speicherfehler führen zu Rechenfehlern.

(Es ist leicht betrügerisch, sollte ihnen aber eine Vorstellung davon geben, woran es liegt.)

quant_dev
quelle
2
Leider funktioniert diese Erklärung nicht, da die Genauigkeitsproblematik auftreten kann, wenn Zahlen summiert werden, die zunächst alle nur aus zwei Ziffern bestehen.
Eric Grange
1
Zwei Dezimalstellen . Ja, ich stimme zu, ein neugieriger Kunde wird Löcher darin entdecken. Aber dann können Sie sie mit der Diskussion der binären Darstellung treffen - sie haben danach gefragt
;-)
Nun, bereits beim Versuch, Fließkommazahlen zu erklären, denkt IME, dass Sie versuchen, sie zu bamboozlen. Dies könnte gelindert werden, wenn es in einfachen, verständlichen Begriffen oder von einer bekannten Institution oder Firma kommt. :)
Eric Grange
1
@Eric Math ist schwer, lass uns Baseball spielen gehen: P
quant_dev
1
Fragen Sie, ob es genauer ist, etwas auf 1/10 "genau oder auf Millimeter genau zu messen. Letzteres ist genauer, aber Objekte, die ein genaues Vielfaches von 0,1" haben, sind kein genaues Vielfaches von 1 mm, es sei denn, es handelt sich auch um a Ein genaues Vielfaches von 5 "(genau 127 mm). Addiert man die Größe von zwei 2,54 mm großen Objekten, die auf 0,1" genau gemessen werden, ergibt sich eine kombinierte Größe von 0,2 ". Addiert man die auf den nächsten Millimeter gerundeten Größen, erhält man 6 mm, obwohl die Die tatsächliche Größe sollte 5,08
mm
1

2/3

Bitten Sie sie, die exakte Antwort auf zwei geteilt durch 3 aufzuschreiben.
Da die Antwort „ewig so bleibt“, können Sie darauf hinweisen.

Die Verwendung von 1/3 würde ebenfalls funktionieren, aber 2/3 ist möglicherweise ein etwas besseres Beispiel, da die Rundung (z. B.) .6666667 ergibt, wohingegen .3333333 so aussieht, als könnte es einfach abgeschnitten werden.

Michael Durrant
quelle
0

Bei Berechnungen verwenden Computer normalerweise Annäherungen an Zahlen (anstelle von 1000000.7 verwenden sie 1000000), da die Verwendung von Annäherungen viel schneller ist. Das Problem dabei ist, dass Sie beim Berechnen mit Approximationen Approximationen zurückerhalten. Normalerweise funktioniert das ziemlich gut, aber manchmal führt es zu unerwarteten Ergebnissen.


quelle
Ich verstehe nicht wirklich, was du hier sagst. "Weil die Verwendung von Approximationen viel schneller ist"? Manchmal ist die ganzzahlige Arithmetik mindestens so schnell, und das ist genau so. Manchmal gibt es keine Alternative (wie beim Ausdrucken der Quadratwurzel von 2).
David Thornley
Nun, Sie versuchen, einem Marketingmitarbeiter zu erklären, warum Computer keine irrationalen Zahlen darstellen können, oder im Grunde genommen jede Zahl im großen Schema der Dinge (oh, und dann möchten Sie ihm vielleicht einen kurzen Vortrag über die Irrationalität von \ pi: irgendetwas geben Fourier-Reihen könnten niedlich sein). Annähernd ist ein Wort, das die Leute verstehen können. Sie nähern sich dem aus der Sicht von jemandem, der weiß, dass nicht alle Zahlen gleich sind.
0

Einige Berechnungen erfolgen nach einer gesetzlichen Vorschrift. Wenn Sie beispielsweise berechnen möchten, wie viel Einkommensteuer in Deutschland auf ein zu versteuerndes Jahreseinkommen von 79.245,18 € zu zahlen ist, gibt es nur eine richtige Antwort. Du verstehst es richtig oder du verstehst es falsch. Wenn Sie es richtig machen, müssen Sie nicht erklären, wie Gleitkomma-Arithmetik funktioniert. Wenn Sie etwas falsch machen, müssen Sie nicht erklären, wie Fließkomma-Arithmetik funktioniert, sondern müssen Ihren fehlerhaften Code korrigieren.

Manchmal werden Ergebnisse angezeigt, die nicht richtig aussehen. Wenn Sie beispielsweise US $ 13.297,46 mit zwei Dezimalstellen in UK £ umwandeln und dann diesen Betrag von UK £ wieder in US $ umwandeln, erhalten Sie möglicherweise nicht US $ 13.297,46, sondern US $ 13.297,45 oder US $ 13.297,47. Das hat nichts mit Gleitkomma-Arithmetik zu tun. Es ist ein unvermeidbares Problem, und Sie sollten besser erklären können, warum es unvermeidbar ist. (Sie sollten auch wissen, warum das Problem nicht auftritt, wenn Sie von UK £ zu US $ und zurück konvertieren.)

Es gibt andere mögliche Ergebnisse, die nicht richtig aussehen. Wenn Sie Zahlen in Prozentsätze konvertieren, sollten die Prozentsätze 100% ergeben, möglicherweise jedoch nicht. Wenn Sie vier Prozentangaben mit zwei Dezimalstellen anzeigen, addieren sich die vier angezeigten Prozentangaben möglicherweise zu 99,99% oder 100,01%. Mit Gleitkomma-Arithmetik nichts zu tun. Trotzdem solltest du erklären können warum.

Als nächstes gibt es Situationen, in denen die unachtsame Verwendung von Gleitkomma-Arithmetik zu unangemessenen Ergebnissen führt. Zum Beispiel ist a + b + c normalerweise nicht dasselbe wie b + c + a. Wenn das ein Problem verursacht, gibt es nichts zu erklären, es ist etwas, das Sie beheben.

gnasher729
quelle