Warum wird einer float-Variablen stop increment bei 16777216 in C#?
float a = 0;
while (true)
{
a++;
if (a > 16777216)
break; //Will never break... a stops at 16777216
}
Kann jemand erklären mir das an, warum ein float-Wert, Stoppt das Inkrementieren bei 16777216 in diesem code?
Edit:
Oder noch einfacher:
float a = 16777217; //a becomes 16777216
stackoverflow.com/questions/3448777/...
stackoverflow.com/questions/6275327/...
Wenn so etwas ist, fangen Sie aus, ich raten Ihnen dringend zu Lesen: Was jeder computer scientist should know about floating-point-Arithmetik. Es wird erläutert, wie Sie sind in hardware implementiert und deckt alle gotcha du wirst irgendwann über den Weg laufen. docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
stackoverflow.com/questions/6275327/...
Wenn so etwas ist, fangen Sie aus, ich raten Ihnen dringend zu Lesen: Was jeder computer scientist should know about floating-point-Arithmetik. Es wird erläutert, wie Sie sind in hardware implementiert und deckt alle gotcha du wirst irgendwann über den Weg laufen. docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
InformationsquelleAutor Jan | 2012-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Zusammenfassung des IEEE-754 floating-point-zahlen (32 bit) aus der Spitze von meinem Kopf:
(sign ? -1 : +1) * 2^exponent * (1.0 + mantissa)
1001 0000 0000 0000 0000 000 = 2^-1 + 2^-4 = .5 + .0625 = .5625
und der Wert vor dem Dezimaltrennzeichen wird nicht gespeichert, sondern implizit angenommen als 1 (wenn der exponent ist 255, 0 angenommen wird, aber das ist hier nicht wichtig), also für den Exponenten der 30, zum Beispiel, dies Mantisse Beispiel stellt den Wert1.5625
Nun zu deinem Beispiel:
16777216 ist genau 224, und würde dargestellt werden als 32-bit-float-etwa so:
10010111
)0 10010111 00000000000000000000000
(+1) * 2^24 * (1.0 + .0) = 2^24 = 16777216
Schauen wir uns nun die Anzahl 16777217, oder genau 224+1:
(+1) * 2^24 * (1.0 + 2^-24) = 2^24 + 1 = 16777217
InformationsquelleAutor AndiDog
16777217 nicht exakt dargestellt werden, mit einem Schwimmer. Die nächst höchste Zahl, die ein float darstellen kann, genau das ist 16777218.
So, Sie versuchen, erhöhen Sie den float-Wert 16777216 zu 16777217, die dargestellt werden kann in ein float.
InformationsquelleAutor Eric J.
Wenn man sich den Wert in seiner binären Darstellung werden Sie sehen, dass es eine eins und viele Nullen, nämlich
1 0000 0000 0000 0000 0000 0000
oder genau 2^24. Das bedeutet, bei 16777216, die Zahl hat nur gewachsen, indem Sie eine Ziffer.Als es ist eine floating-point-Zahl, kann dies bedeuten, dass die Letzte Ziffer am Ende, ist immer noch gespeichert (D. H. in seiner Genauigkeit) ist nach Links verschoben, so gut.
Wahrscheinlich, was Sie sehen, ist, dass die Letzte Ziffer der Präzision hat sich nur verschoben, um etwas, das größer als eins ist, so das hinzufügen einer macht keinen Unterschied mehr.
Und selbst wenn, ich kann nicht lernen, der Grund für den ersten downvote, darf ich Fragen, für einen Grund für die zweite, bitte?
InformationsquelleAutor O. R. Mapper
Vorstellen, diese in dezimaler form. Angenommen, Sie hätten die Nummer:
oder 1.000.000. Wenn alles, was Sie hatte, waren sechs Ziffern der Genauigkeit, Zugabe von 0,5 bis diese Zahl ergeben würde
Allerdings die derzeitigen überlegungen mit fp Rundung Modi ist die Verwendung von "Round-to-Even," anstatt "Runde auf die Nächste." In diesem Beispiel, jedes mal, wenn Sie erhöhen Sie diesen Wert, wird es mit rundem Rücken nach unten in die floating-point-unit zurück zu 16.777.216, oder 2^24. Singles in IEE 754 dargestellt als:
wo die "1." wird impliziert, und die Fraktion ist ein weiterer 23 bits, Nullen, in diesem Fall. Die zusätzlichen binäre 1 wird verschütten in die guard digit, tragen, unten an der Rundung Schritt, und werden jedes mal gelöscht, egal wie oft Sie erhöhen es. Die
ulp
oder Einheit in der letzten Stelle wird immer null sein. Die Letzte erfolgreiche Schrittweite von:InformationsquelleAutor Max