Wie Berechnen Double + Float-Präzision
Habe ich versucht zu finden, wie die Berechnung der Floating - /Double precision/- Bereich zahlen
-3.402823e38 .. 3.402823e38 und -1.79769313486232e308 .. 1.79769313486232e308.
Für int32 Sie tun würde 2^32=4294967296/2 erhält man einen Bereich von -2147483648 bis 2147483647. Also, wie komme ich auf die Genauigkeit zahlen für float und double. Ich denke, ich bin auf der Suche die falschen Begriffe, da wird nichts kommen überall.
- Kurze Antwort: die max. - Wert für einen double-precision-Wert (vorausgesetzt, IEEE 754 floating-point) ist genau 2^1024 * (1 - 2^-53). Für eine single-precision-Wert es ist 2^128 * (1 - 2^-24).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, beide Arten eigentlich wie folgt Aussehen:
repräsentiert eine Zahl in der folgenden form:
mit der Größe des Exponenten und der Mantisse unterschiedliche. Für
float
der exponent ist acht bits breit, währenddouble
hat eine elf-bit-Exponenten. Darüber hinaus ist der exponent gespeichert unsigned mit einem bias das ist 127 fürfloat
und 1023 fürdouble
. Dies führt zu einer Bandbreite für den Exponenten von -126 bis 127 fürfloat
und-1022-obwohl 1023 fürdouble
.Exponenten ist der exponent für 2irgendwas, so dass bei der Berechnung 2127 Sie erhalten von 1,7 × 1038, die Sie in die Ungefähre Reichweite der
float
maximale Wert. Ebenso fürdouble
mit 9 × 10307.Offensichtlich haben diese zahlen sind nicht genau diejenigen, die wir erwarten. Dies ist, wo die Mantisse ins Spiel kommt. Die Mantisse repräsentiert eine normalisiert binäre Zahl, die immer beginnt mit "1". (das ist der normalisierte Teil). Der rest ist einfach nur die Ziffern nach dem Punkt. Da die maximale Mantisse ist dann etwa 1.111111111... in binären, die fast 2, erhalten wir etwa 3,4 × 1038 als
float
's maximum-Wert und 1,79 × 10308 als der maximale Wert fürdouble
.[BEARBEITEN 2011-01-06] Als die Punkte Markieren, die weiter unten aufgeführt (und der Frage), die genaue Formel ist die folgende:
wo e ist die Anzahl der bits im Exponenten und p ist die Anzahl der bits in der Mantisse, einschließlich der oben genannten impliziten bit (wegen der Normalisierung). Die Formel repliziert, was wir oben gesehen haben, erst jetzt richtig. Der erste Faktor, 22e − 1, ist der maximale exponent, mit zwei multipliziert (wir sparen die zwei in den zweiten Faktor, so). Der zweite Faktor ist die größte Zahl, die wir darstellen können unter einem. Ich sagte oben, dass die Zahl fast zwei. Da wir übertrieben die Exponenten um einen Faktor von zwei in dieser Formel, die wir berücksichtigen müssen, und jetzt haben Sie eine Zahl, die fast ein. Ich hoffe es ist nicht allzu verwirrend.
In jedem Fall, für
float
(mit e = 8 und p = 24) erhalten wir den exakten Wert 340282346638528859811704183484516925440 oder etwa 3.4 × 1038.double
ergibt dann (mit e = 10 und p = 53) 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 oder etwa 1.80 × 10308.[/EDIT]
Andere Sache: Sie bringen den Begriff "Präzision" in Ihrer Frage, aber Sie zitieren die reicht der Arten. Genauigkeit ist eine ganz andere Sache und bezieht sich darauf, wie viele signifikante Ziffern die Art binden zu können. Wieder, die Antwort liegt hier in der Mantisse, die ist 23 und 52 bits für
float
unddouble
bzw. Da die Nummern gespeichert sind normalisiert, wir haben tatsächlich eine implizite bit Hinzugefügt, dass, was bringt uns am 24 und 53 bits. Nun, die Art, wie die Ziffern nach dem Komma (oder binary hier) Punkt der Arbeit ist die folgende:Also die Letzte Ziffer in der
double
Mantisse repräsentiert einen Wert von rund 2.2 × 10-16 oder 2-52, so dass, wenn der exponent 1 ist, dies ist der kleinste Wert, den wir hinzufügen können, um die Anzahl – Platzierung derdouble
Präzision rund 16 Dezimalstellen. Ebenfalls fürfloat
mit etwa sieben stellen.2^(2^(e-1)) * (1 - 2^p)
für ein IEEE-754-binary-Typ mite
bits für den Exponenten und diep
bits (einschließlich der hidden-bit) für die Mantisse?[float]::MaxValue
mir gibt. Danke für die explizite Formel aber nicht, aber es gibt -5.7e45 statt 3.4e38. 2^(2^(e− 1)) * (1 − 2^−p) funktionieren würde. (Obwohl-jetzt bin ich bei einem Verlust zu erklären, warum es "1 - 2^−p" und nicht "2 - 2−^p" wie ich schon in dem post oben (der Teil mit "fast zwei"). Noch zu früh, und heute, wenn meine Argumentation in der post ist einfach falsch, bitte korrigieren wenn Sie einen korrigierbaren Fehler. Ich ging einfach weiter zu erklären, so gut ich konnte, aufgrund der anderen Antworten als falsch zu albern ist.2^-p
, nicht2^p
. Danke!Ich habe diskutiert, die floating-point-format aus verschiedenen (aber nicht allen natürlich) Aspekte. Diese Antwort kann Ihnen helfen: https://stackoverflow.com/questions/4851671/printing-double-without-losing-precision
Der Typ float darstellen kann Werte im Bereich von etwa 1,5 × 10-45 3,4 × 1038 mit einer Genauigkeit von 7 stellen.
Der Typ double darstellen kann Werte im Bereich von ungefähr 5.0 × 10-324 1,7 × 10308 mit einer Genauigkeit von 15-16 stellen.
http://msdn.microsoft.com/en-us/library/aa691146%28v=vs.71%29.aspx
es ist nicht so einfach zu berechnen. dies ist aufgrund der Art und Weise, die floats und doubles sind umgesetzt. Sie sind beide Gliedern sich in zwei Teile: ein Teil für die Basis-Nummer, und einen Teil für den Exponenten. ich denke, float gliedert 24 bits, um die Basis-Nummer und 8 bits für den Exponenten. aber ich bin mir nicht sicher, ob das auch! ich werde meine weiteren Berechnungen und Annahmen, auf diese Tatsache, obwohl, so dass diese Berechnungen können alle falsch sein, aber Sie zeigen die richtigen Grundsätze. diese Daten könnten auch unterscheiden sich von Sprache zu Sprache, auch wenn es Normen, die sagen, Sie sollten nicht. aber nichts für selbstverständlich genommen werden kann, während der Programmierung :p
dies bedeutet, dass die Nummer der Basisstation kann zwischen -8388608 und 8388607, und der exponent kann zwischen -128 und 127.
dann, wenn die Nummer verwendet wird, der computer denkt so:
führt, um die größte mögliche Anzahl Wesen 8388607 * 10 ^ 127, das wäre... eine Menge. aber es würde enthalten 120 Nullen, denn es kann nicht angeben, mehr als 7 mehr zahlen.
die Genauigkeit die Anzahl wird geringer als die Anzahl wächst. dies bedeutet, dass Ihre Frage ist schlecht formatiert 😉 Sie können nur geben Sie einen gültigen Bereich für einen Schwimmer, wenn Sie wissen, welche Zahl der richtigen Dezimalstellen erforderlich sind. wenn Sie die Möglichkeit 2 garantiert exakte Dezimalzahlen, dann schweben würde, haben eine Reihe von -83885 zu 83885.