Fakt ist, dass sowohl ein float als auch ein int mit 32 Bits dargestellt werden. Der ganzzahlige Wert verwendet alle 32 Bits, so dass er Zahlen von -2 -1 aufnehmen kann. Ein Float verwendet jedoch 1 Bit für das Vorzeichen (einschließlich -0,0f) und 8 Bit für den Exponenten. Die Mittel 32 - 9 = 23 Bits übrig für die Mantisse. Der Float setzt jedoch voraus, dass, wenn die Mantisse und der Exponent nicht Null sind, die Mantisse mit einer 1 beginnt. Sie haben also mehr oder weniger 24 Bit für Ihre ganze Zahl anstelle von 32. Da sie jedoch verschoben werden kann, bringt sie mehr als 2 ganze Zahlen.
A floating point uses a Sign, an eXponent, and a Mantissa
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
An integer has a Sign, and a Mantissa
S M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M
also eine ganze Zahl wie:
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
in einem Schwimmer passt, weil es verschoben werden kann:
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
| | |
| +---------+ +---------+
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
ich dich nicht der Exponent zeigen, weil ich am häufigsten Machen Sie einen Fehler bei der Berechnung, aber es sollte etwa 5 (oder -5?) sein, weil ich um 5 Bits verschoben habe (aber Sie müssen 128 addieren oder subtrahieren ...). Dies zeigt deutlich, dass wenn Sie um 5 Bits verschieben müssen, Sie die 5 unteren Bits verlieren.
So kann diese andere Ganzzahl in einen Float mit einem Verlust von 2 Bits umgewandelt werden (dh wenn Sie wieder in eine ganze Zahl konvertieren, werden die letzten zwei Bits (11) auf Null gesetzt, da sie nicht gespeichert wurden) der Schwimmer):
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1
| | | | | | | |
| +---------+ +---------+ +-+-+-+-+--> all lost
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
Ziemlich einfache Sachen wirklich.
WICHTIGER HINWEIS: Ja, die erste 1 in der ganzen Zahl ist das Vorzeichen, dann die nächste 1 wird nicht in die Mantisse kopiert, es wird angenommen, dass sie 1 ist, also ist es nicht erforderlich.
Nichts mit Ihrem spezifischen Problem zu tun, aber wenn Sie glauben, dass floats irgendwie schneller als verdoppelt sein können, liegen Sie falsch - der Zweck von floats ist es, Speicheranforderungen zu minimieren, die für moderne Anwendungen selten ein Problem sind. Ihre Standardauswahl für den Datentyp sollte Double, nicht Float sein. –
@Neil: Das hängt sehr von der CPU ab. Es gibt viele Architekturen, bei denen Float dramatisch schneller ist als doppelt. – jalf
@jalf Möglich, aber in den meisten Situationen in C- oder C++ - Code werden die Floats trotzdem zu Doubles hochgestuft. –