Ich fand einen Artikel wie den folgenden, also schrie ich "Beweg dich nicht! Gleitkomma-Polizei!" Und stieg ein.
Ich glaube jedoch nicht, dass es so eine große Sache gibt.
Wie viele Leute denken, handelt es sich um ein allgemeines Thema von Gleitkommazahlen und nicht um ein auf Python spezialisiertes Thema, oder es wird gesagt, dass es seltsam ist, weil es riesig ist ("Gleitkomma-Ganzzahlen über 2 ^ 53"). Es gibt einige seltsame Wörter wie "Wenn Sie ein paar Berechnungen durchführen, können Sie den Inhalt auf einen Schlag verstehen"), aber ich denke, es gibt kein großes Missverständnis.
Es gibt jedoch nur eine Beschreibung wie folgt:
109999999999999995805696 0x1.74b1ca8ab05a8p + 76 ~ Alle während dieser Zeit 0x1.74b1ca8ab05a9p + 76 ~ 110000000000000012582912 0x1.74b1ca8ab05aap + 76 Die Breite des Abschnitts beträgt 2 bis 24. Potenz, 16777216
Ich war ein wenig besorgt über diese Gegend. Ist es in Ordnung zu sagen, dass die Breite dieses Abschnitts 2 ^ 24 beträgt? Lass uns genauer hinschauen.
.hex() Gleitkomma-Darstellung in |
Die kleinste Ganzzahl mit derselben Darstellung | Maximale Ganzzahl bei gleicher Darstellung | Anzahl der in diesem Intervall enthaltenen Ganzzahlen |
---|---|---|---|
0x1.74b1ca8ab05a8p+76 | 109999999999999979028480 | 109999999999999995805696 | 16777217 |
0x1.74b1ca8ab05a9p+76 | 109999999999999995805697 | 110000000000000012582911 | 16777215 |
0x1.74b1ca8ab05aap+76 | 110000000000000012582912 | 110000000000000029360128 | 16777217 |
Auf diese Weise kann gesehen werden, dass es unter Berücksichtigung der Breite des Intervalls, das zur gleichen Darstellung der Gleitkommazahl wird, nicht konstant ist. Es ist ungefähr 2 ^ 24, also ist das in Ordnung! Es ist in Ordnung, das zu verstehen, aber da ich bisher recherchiert habe, denke ich, dass es in Ordnung ist, etwas tiefer zu graben.
Der Schuldige dieses scheinbar mysteriösen Phänomens ist die "gleichmäßige Rundung", eine Gleitkommazahl-Rundungsmethode. Dies wird manchmal als Banker-Rundung bezeichnet, aber grob gesagt bedeutet es "Rundung auf eine gerade Zahl, wenn sie sich in der Mitte der Zahl befindet, die ausgedrückt werden kann, und Rundung auf die nähere Seite, wenn dies nicht der Fall ist".
Kurz gesagt, wenn Sie 0,5 auf eine ganze Zahl runden möchten, sollten Sie sie auf 0 anstatt auf 1 runden, und wenn Sie 1,5 runden möchten, sollten Sie sie auf 2 runden.
Sie verstehen möglicherweise nicht die Bedeutung von "Auf eine gerade Zahl runden", obwohl Sie sich jetzt nur mit ganzen Zahlen befassen, mit anderen Worten, in Form von Gleitkommazahlen, "wenn es sich um die Mitte der Zahl handelt, die ausgedrückt werden kann, das niedrigste Bit des falschen Teils". Runde zur Seite, wo 0 "ist.
Wenn Sie 109999999999999995805696 auf eine Gleitkommazahl runden, sind die nächstgelegenen Gleitkommazahlen 109999999999999987417088,0 (= 0x1,74b1ca8ab05a8p + 76) und 11000000000000000004194304.0 (= 0x1,74b1ca8ab05a9p + 76). In diesem Fall ist der erstere gerade, so dass er auf den ersteren gerundet ist.
Mit anderen Worten, bei gerader Rundung ist die auf gerade gerundete Ganzzahl eins mehr als die ursprüngliche Breite (?) Des Abschnitts, und die auf ungerade gerundete Ganzzahl ist eins weniger, sodass die Breite des Abschnitts abwechselnd zunimmt oder abnimmt, wie oben gezeigt. Deshalb.
~~ Multipliziere die Polizei mit langen ganzen Zahlen und überlasse es anderen ~~
Die hexadezimale Notation von Gleitkommazahlen ist wunderbar, da Sie auf einen Blick erkennen können, ob das niedrigstwertige Bit des formalen Teils 0 oder 1 ist. Ich möchte, dass es in mehr Sprachen übernommen wird.