Bei der Untersuchung der Genauigkeit von Gleitkommazahlen habe ich an einigen Stellen eine ähnliche Aussage gesehen
" float und double sind ( für / verwendet oft in ) Ingenieurwesen und wissenschaftliche Berechnung "
Nach meinem Verständnis ist die Stärke von Floats und Doubles die Menge an Speicher, die sie für ihre (gute, aber nicht perfekte) Präzision verwenden.
Ich habe das Gefühl, dass ich durch diese Antwort fast ein Verständnis bekomme
"Mit Gleitkommazahlen können Sie kontinuierliche Größen modellieren"
Ich bin immer noch nicht davon überzeugt, dass ich es verstehe. Ingenieurwissenschaften und Naturwissenschaften klingen beide wie Bereiche, in denen Sie genaue Ergebnisse aus Ihren Berechnungen erhalten möchten , die meines Wissens keine Fließkommazahlen ergeben. Ich bin mir auch nicht sicher, was genau eine "kontinuierliche Menge" ist.
Kann jemand diese Erklärung erläutern und vielleicht ein Beispiel geben?
quelle
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.
In Wissenschaft und Technik geht es Ihnen nur um Präzision bis zu einem bestimmten Punkt. Die Verwendung von unendlicher Präzision für jede Berechnung ist häufig unnötig teuer. Was Fließkomma von Festkomma unterscheidet, ist, dass Sie sich nicht auf eine bestimmte Anzahl von Dezimalstellen festlegen müssen - Sie können wirklich kleine Mengen mit vielen Dezimalstellen oder wirklich große Mengen mit begrenzter Genauigkeit haben.Antworten:
Die Berechnung in Wissenschaft und Technik erfordert Kompromisse in Bezug auf Präzision, Reichweite und Geschwindigkeit. Festkomma-Arithmetik liefert Präzision und angemessene Geschwindigkeit, beeinträchtigt jedoch die Reichweite. BigNum, beliebige Präzisionsbibliotheken, gewinnen an Reichweite und Präzision, verlieren jedoch an Geschwindigkeit.
Der springende Punkt ist, dass die meisten wissenschaftlichen und technischen Berechnungen eine hohe Geschwindigkeit und eine große Reichweite erfordern, jedoch nur einen relativ geringen Präzisionsbedarf haben. Die am besten bestimmte physikalische Konstante ist nur bis zu 13 Stellen bekannt, und viele Werte sind mit weitaus geringerer Sicherheit bekannt. Mehr als 13 Stellen Genauigkeit auf dem Computer zu haben, wird das nicht helfen. Das Problem in der Salbe ist, dass Sequenzen von Gleitkommaoperationen allmählich an Präzision verlieren können. Das A und O der numerischen Analyse ist es, herauszufinden, welche Probleme besonders anfällig sind, und clevere Wege zu finden, die Abfolge der Operationen neu zu ordnen, um das Problem zu verringern.
Eine Ausnahme bildet die Zahlentheorie in der Mathematik, die arithmetische Operationen an Zahlen mit Millionen von Ziffern, aber mit absoluter Genauigkeit ausführen muss. Zahlentheoretiker verwenden häufig BigNum-Bibliotheken, und ihre Berechnungen nehmen viel Zeit in Anspruch.
quelle
a*b*c
einfache Sache, aber Sie müssen die Dimensionen messen, die Sie nicht mit absoluter Sicherheit tun können, so dass Sie sowieso nicht wirklich unendlich genaue Berechnungen benötigen, gerade genug, um durch Messfehler gebunden zu sein.Welche Alternative schlagen Sie vor?
Kontinuierliche Größen werden in der Mathematik mit reellen Zahlen dargestellt. Es gibt keinen Datentyp, der jede mögliche reelle Zahl codieren kann (da es unzählige reelle Zahlen gibt). Das bedeutet, dass wir nur eine Teilmenge der reellen Zahlen auswählen können, an denen wir am meisten interessiert sind.
Sie können alle berechenbaren Real-Werte auswählen, ähnlich wie dies bei Computeralgebra-Systemen (CAS) der Fall ist. Das Problem ist, dass es schnell undurchführbar wird, wenn Ihr Ausdrucksbaum größer und größer wird. Es ist auch sehr langsam: Versuchen Sie, ein riesiges System von Differentialgleichungen in Mathematica symbolisch zu lösen, und vergleichen Sie es mit einer anderen Implementierung auf Gleitkommabasis. Sie werden einen dramatischen Geschwindigkeitsunterschied feststellen. Darüber hinaus haben Jörg W. Mittag und Kasperd darauf hingewiesen: Sie haben nicht einmal entscheidbare Gleichheits- / Vergleichsoperationen.
Sie könnten exakte rationale Zahlen verwenden, aber das funktioniert für viele Anwendungen nicht wirklich, da Sie Quadratwurzeln oder Kosinusse oder Logarithmen usw. berechnen müssen. Außerdem besteht die Tendenz, dass Rationalitäten immer komplexer werden und daher mehr Speicherplatz benötigen und Zeit für die Verarbeitung, wenn Sie immer mehr Berechnungen an ihnen durchführen.
Sie können auch Dezimalstellen mit beliebiger Genauigkeit verwenden, aber selbst eine einfache Division funktioniert nicht, da sich die Ziffern unendlich oft wiederholen. Sie können auch auf das Problem der zunehmenden Komplexität stoßen, wenn Sie rationale Zahlen ähnlicher ausführen, wenn auch in geringerem Maße.
Sie müssen also irgendwann Näherungswerte verwenden. In diesem Fall sind Gleitkommazahlen am besten geeignet. Gleitkommazahlen haben ebenfalls eine feste Breite (im Gegensatz zu allen anderen drei zuvor erwähnten Datentypen), wodurch die Komplexität nicht zunimmt, wenn Sie immer mehr Berechnungen an ihnen durchführen.
quelle
Ihr Satz über die Wissenschaft ist falsch, Ingenieurwissenschaften und andere Wissenschaften als Mathematik arbeiten nicht mit exakten genauen Ergebnissen. Sie arbeiten mit einem Genauigkeitsfaktor, der in die Anzahl der angezeigten Stellen integriert ist.
Der Schlüsselbegriff, den Sie hier verstehen müssen, lautet: signifikante Zahlen . Die signifikanten Ziffern einer Zahl sind die Ziffern, deren Bedeutung zur Genauigkeit beiträgt.
Was im Grunde bedeutet, wenn ich angabe, dass etwas 12 Zentimeter lang ist, kann es tatsächlich zwischen 11,5 und 12,5 Zentimeter lang sein. Wenn ich jedoch sage, dass etwas 12,00 Zentimeter lang ist, kann es irgendwo zwischen 11.995 und 12.005 Zentimeter lang sein.
Nur als Illustration, wenn Sie ein Maßband nehmen und Ihr Wohnzimmer messen. Obwohl Sie vielleicht feststellen, dass es 6 Meter bis 25 Zentimeter breit ist, wissen Sie, dass Ihr Maßband nicht genau genug ist, um etwas über die Millimeter- oder Nano-Meter-Genauigkeit zu sagen.
quelle
Beachten Sie, dass Gleitkommazahlen im Grunde genommen der wissenschaftlichen und technischen Notation entsprechen, der Standardmethode für Menschen, um Zahlen in Mathematik und Naturwissenschaften zu schreiben. In diesen Bereichen besteht kein großes Bedürfnis nach äußerster Präzision, aber es gibt oft eine große Bandbreite.
Um ein zufälliges Beispiel aus meinen Physik-Hausaufgaben zu wählen, musste ich kürzlich mit der Masse eines Elektrons arbeiten, die ungefähr 9,11 * 10 ^ -31 kg beträgt. Die Präzision ist mir egal. es könnte leicht 9.12 sein, wenn es mich interessiert. Aber ich interessiere mich für den Exponenten und möchte nicht 0,0000 ... 911 kg ausschreiben müssen, also verwende ich die wissenschaftliche Notation.
Ähnliches gilt für das wissenschaftliche und technische Rechnen: Es gibt eine große Bandbreite, aber wir möchten nicht, dass sehr große Zahlen gespeichert und verarbeitet werden. Daher speichern wir einen normalisierten Wert und einen Exponenten, mit dem kleiner und schneller gearbeitet werden kann.
quelle
Gleitkommazahlen haben auch mehrere Eigenschaften, die sich gut für die Berechnung bestimmter Arten von wissenschaftlichen Ergebnissen eignen. Vor allem ist die Präzision umgekehrt proportional zur Größe, genau wie in der wissenschaftlichen Notation, sodass Sie sowohl kleine Unterschiede nahe Null als auch größere Unterschiede in größerer Entfernung darstellen können.
Goldbergs Artikel ist wahrscheinlich die bekannteste Analyse der Eigenschaften von Gleitkommazahlen (und sollte unbedingt gelesen werden, wenn Sie sich für so etwas interessieren), aber Kahans Artikel sind meiner Meinung nach besser geeignet, die Hintergründe für viele der subtilen Aspekte zu erklären Designprobleme.
Insbesondere die Kahan Tirade über Java-Implementierung von Floating - Point , während ziemlich entzündlich, macht einige gute Punkte , warum IEEE-754 - Semantik sind nützlich, und Much Ado About Nothing Zeichen des Bit untersucht die Gründe für signierte Null in beträchtlicher Tiefe.
quelle
real
Typ hinzugefügt hätte, der drei Stapeleinträge zum Speichern benötigt und die natürliche Rechengenauigkeit der Maschine darstellt. Der Wert kann als 80-Bit-Float + 16-Bit-Padding, 64-Bit-Float + 32-Bit-Padding oder 64-Bit-Mantisse, 16-Bit-Exponent und 16-Bit-Padding für Vorzeichen und Flags [für Nicht-FPU-Implementierungen] gespeichert werden.float
unddouble
Speicherformate sind, undreal
ist das Berechnungsformat. In vielen Systemen ohne FPU ist die Arbeit mit einer Mantisse, einem Exponenten und Flags, die sich an Wort- und Halbwortgrenzen befinden, schneller, als wenn bei jeder Operation Doppelte entpackt und neu gepackt werden müssten.TL; DR Wir wissen nicht, wie man die meisten Funktionen mit perfekter Genauigkeit berechnet, daher macht es keinen Sinn, Zahlen mit perfekter Genauigkeit darzustellen.
Bei allen bisherigen Antworten fehlt der wichtigste Punkt: Für die meisten Zahlen können wir keine exakten Werte berechnen. Als wichtiger Sonderfall können wir keine exakten Werte der Exponentialfunktion berechnen - um nur die wichtigste irrationale Funktion zu nennen.
Naive Antwort auf die naive Frage
Ihre Frage scheint eher zu lauten: "Es gibt exakte arithmetische Bibliotheken. Warum verwenden wir sie nicht anstelle von Gleitkomma-Arithmetik?" Die Antwort lautet, dass exakte Arithmetik mit rationalen Zahlen funktioniert und dass:
Die rationale Zahl ist ein glücklicher Zufall. Die meisten Zahlen sind nicht rational (siehe Baires Theorem), so dass die Berechnung von Zahlen uns immer aus der rationalen Welt herausbringen wird.
Was rechnet und repräsentiert eine Zahl?
Wir können reagieren, indem wir sagen: "OK, das Problem ist, dass rationale Zahlen keine so gute Wahl waren, um reelle Zahlen darzustellen." Dann rollen wir Debian auf und entwickeln ein neues Darstellungssystem für reelle Zahlen.
Wenn wir Zahlen berechnen wollen, müssen wir ein Repräsentationssystem für reelle Zahlen auswählen und wichtige Operationen auf diesen beschreiben - dh definieren, was Rechnen bedeutet. Da wir an wissenschaftlichem Rechnen interessiert sind, möchten wir alle Dezimalzahlen (unsere Maße), ihre Quotienten (rationale Zahlen), Werte der Exponentialfunktionen und einige lustige Konstanten, wie die Zahl von Archimede, genau darstellen.
Das Problem ist, dass die einzige Möglichkeit, Zahlen in einem solchen System perfekt darzustellen, darin besteht, die symbolische Form zu verwenden, also überhaupt nichts zu berechnen und mit algebraischen Ausdrücken zu arbeiten. Dies ist eine ziemlich verkrüppelte Darstellung von reellen Zahlen, weil wir zwei Zahlen nicht zuverlässig vergleichen können (welche ist größer)? Wir können die Frage „Ist die angegebene Zahl gleich 0?“ Nicht einmal leicht beantworten.
Wenn Sie nach genaueren mathematischen Definitionen und Problemen suchen, suchen Sie beispielsweise nach rationalen Zahlen, transzendentalen Zahlen, besten Approximationen und dem Satz von Baire.
quelle
weil
1) Die Autoren gehen davon aus, dass "technische und wissenschaftliche Berechnungen" reale physikalische Größen messen
2) Physikalische Größen sind stetig und genau so, wie Sie "Gleitkommazahlen lassen Sie stetige Größen modellieren" angeben.
.. und der Rest meiner Antwort wird gut von Rufflewind zusammengefasst , also werde ich das hier nicht wiederholen.
quelle
Gleitkommazahlen bieten eine relative Genauigkeit: Sie können Zahlen darstellen, die höchstens einen kleinen Prozentsatz (wenn Sie etwa 0,0000000000001% prozentual nennen möchten) von jeder genauen Zahl in einem weiten Bereich von Zahlen entfernt sind. Sie teilen dieses Merkmal mit einem Rechenschieber, obwohl letzterer nicht besser wird als etwas mit einer Genauigkeit von 3 Stellen. Dennoch war es völlig ausreichend, um die statischen und dynamischen Kräfte großer Strukturen zu ermitteln, bevor digitale Computer dafür zur Gewohnheit wurden, und das liegt daran, dass die Materialkonstanten auch einige Variationen aufweisen und die Auswahl von Konstrukten, die in Bezug auf Material- und Konstruktionsunterschiede relativ harmlos sind, tendenziell ist maximale Belastungen und Schwachstellen sinnvoll identifizierbar zu machen.
Jetzt ist "Genauigkeit" ein nützliches Merkmal für viele Zahlen, die Messungen und / oder Größen von physikalischen Eigenschaften darstellen.
Nicht alles in Wissenschaft / Technik gehört in diese Kategorie. Wenn Sie zum Beispiel zahlentheoretische Transformationen zum Multiplizieren großer Zahlen oder Galois-Felder zum Manipulieren von Fehlerkorrekturpolynomen verwenden, gibt es keinen kleinen Fehler: Jeder einzelne Bitfehler während der Verarbeitung führt zu Ergebnissen, die nicht vollständig zufällig sind Lärm.
Selbst in diesen Bereichen kann man mit Gleitkommazahlen arbeiten (wie bei der Faltung mit komplexen FFTs), wenn man die Anhäufung von Fehlern verfolgt und sicherstellt, dass die Gleitkommafehler nicht so groß sind, dass möglicherweise sogar ein einzelnes Bit eingekippt wird die tatsächlichen Entitäten, von denen sie eine Annäherung sind. Für solche Annäherungen wäre eine Festkommaverarbeitung wahrscheinlich geeigneter, aber Gleitkommaeinheiten im Feld neigen dazu, eine schnellere Operation und eine größere Anzahl verwendbarer Bits bereitzustellen.
Auch Programmiersprachen wie C oder Fortran erschweren überraschend den Zugriff auf Grundoperationen wie Multiplikation und Division mit gemischter Genauigkeit oder ein Übertragsbit für Addition / Subtraktion. Dies sind grundlegende Bausteine, um über Ganzzahlen mit begrenzter Genauigkeit hinauszugehen.
Wenn Sie also Operationen auf Gleitkommazahlen abbilden können, verfügen Sie heutzutage in der Regel über ausreichend leistungsfähige Hardware und können Ihre Algorithmen in einer der heutigen allgemeinen Programmiersprachen gut spezifizieren.
quelle
Ich denke, dies kann beantwortet werden, indem angesprochen wird, für welche Anwendungen
float
/double
Datentypen sie nicht geeignet sind.Wenn Sie sicherstellen müssen, dass Sie eine Zahl mit einer bestimmten Anzahl von Ziffern genau darstellen können, sind Gleitkommazahlen ungeeignet, da sie die Zahlen als Zweierpotenzen anstelle von Zehnerpotenzen darstellen, wie wir sie in darstellen die wahre Welt.
Eine Domäne, in der Gleitkomma-Datentypen nicht verwendet werden sollten, ist die der Finanzen *. Für das Kernsystem einer Bank wäre es völlig inakzeptabel, wenn ein Betrag, der 100000,01 USD hätte betragen sollen, plötzlich 100000,00 USD oder 100000,02 USD beträgt.
Ein solches Problem kann bei der Verwendung von Floats leicht auftreten, insbesondere wenn die Zahl das Ergebnis einer oder mehrerer Berechnungen war, z. B. die Berechnung der Summe aller Transaktionen in einem Konto.
Engineering und wissenschaftliche Berechnung sind Bereiche, in denen diese relativ kleinen Rundungsfehler akzeptabel sind. Benutzer sind sich normalerweise bewusst, dass alle Zahlen eine begrenzte Genauigkeit haben und sie arbeiten oft mit einer Reihe von signifikanten Ziffern . Vor allem aber haben sie eine genau definierte relative Genauigkeit, dh sie haben die gleiche Anzahl signifikanter Stellen, sowohl für sehr große Zahlen als auch für sehr kleine Zahlen.
* Ich habe einmal an einer Finanzanwendung gearbeitet, bei der
float
s zur Darstellung von Werten verwendet wurde, und in der Folge wurden Rundungsfehler eingeführt. Glücklicherweise war dieser spezifische Fehler überhaupt nicht kritisch, die Benutzer haben sich über Rechenfehler im Programm beschwert. Und dies führte zu einem anderen, viel schlimmeren Effekt: Die Benutzer begannen, das Vertrauen in das System zu verlieren.quelle