wake-up-neo.com

Wie groß ist float und double in C und C ++?

Ich habe gesucht, ob es einen ähnlichen Standardtyp wie uint32_t Gibt, der immer einen 32-Bit-Integraltyp ohne Vorzeichen darstellt, aber keinen gefunden habe.

Beträgt die Größe von float auf allen Plattformen immer 4 Byte?
Ist die Größe von double immer 8?

Sagt einer der Standards etwas in der Sache?

Ich möchte sicherstellen, dass meine Größe auf allen Plattformen (x86 und x64) immer gleich ist, daher verwende ich Standard-Int-Typen, konnte jedoch keine ähnliche Typdefinition für float und double finden. .

23
mans

Auszug aus dem C99-Standard, normativer Anhang F (Der C++ - Standard erwähnt diesen Anhang nicht ausdrücklich, enthält jedoch alle betroffenen Funktionen ohne Änderung per Referenz. Außerdem müssen die Typen übereinstimmen, um Kompatibilität zu gewährleisten.):

Gleitkomma-Arithmetik nach IEC 60559

F.1 Einleitung

1 In diesem Anhang wird die Unterstützung der Sprache C für den Gleitkomma-Standard IEC 60559 festgelegt. Der Gleitkomma-Standard IEC 60559 ist speziell eine binäre Gleitkomma-Arithmetik für Mikroprozessorsysteme, zweite Ausgabe (IEC 60559: 1989), die zuvor als IEC 559: 1989 und als IEEE-Standard für bezeichnet wurde Binäre Gleitkomma-Arithmetik (ANSI/IEEE 754−1985). Der IEEE-Standard für radixunabhängige Gleitkomma-Arithmetik (ANSI/IEEE 854−1987) verallgemeinert den Binärstandard, um Abhängigkeiten von Radix und Wortlänge zu beseitigen. IEC 60559 bezieht sich im Allgemeinen auf den Gleitkomma-Standard, wie in IEC 60559-Operation, IEC 60559-Format usw. Eine Implementierung, die __STDC_IEC_559__ muss den Spezifikationen in diesem Anhang entsprechen.356) Wenn eine Bindung zwischen der Sprache C und IEC 60559 angegeben ist, wird das von IEC 60559 angegebene Verhalten durch Bezugnahme übernommen, sofern nicht anders angegeben Andernfalls. Da negative und positive Unendlichkeit in IEC 60559-Formaten darstellbar sind, liegen alle reellen Zahlen im Bereich darstellbarer Werte.

Schließen Sie also <math.h> (Oder in C++ vielleicht <cmath>) Ein und testen Sie auf __STDC_IEC_559__.

Wenn das Makro definiert ist, werden nicht nur die Typen besser spezifiziert (float ist 32 Bit und double ist unter anderem 64 Bit), sondern auch das Verhalten von eingebauten Operatoren und Standardfunktionen.
Das Fehlen des Makros gibt keine Garantie.

Für x86 und x86_64 (AMD64) können Sie sich darauf verlassen, dass die Typen float und double IEC-60559-konform sind, obwohl Funktionen, die sie verwenden, und Operationen auf ihnen möglicherweise nicht funktionieren.

14
Deduplicator

Sagt nichts über die Größe.

3.9.1.8

Es gibt drei Gleitkommatypen: float, double und long double. Der Typ double liefert mindestens so viel Präzision wie float, und der Typ long double liefert mindestens so viel Präzision wie double. Die Wertemenge vom Typ float ist eine Teilmenge der Wertemenge vom Typ double; Die Wertemenge vom Typ double ist eine Teilmenge der Wertemenge vom Typ long double. Die Wertdarstellung von Gleitkommatypen ist implementierungsdefiniert. Integral- und Floating-Typen werden gemeinsam als arithmetische Typen bezeichnet. Spezialisierungen der Standardvorlage std :: numeric_limits (18.3) müssen die Maximal- und Minimalwerte jedes arithmetischen Typs für eine Implementierung angeben.

12
Blaz Bratanic

Der C++ - Standard sagt nichts aus, aber auf den meisten Plattformen verwendet C++ den IEEE-Standard mit einfacher/doppelter Genauigkeit, der eine einfache Genauigkeit von 4 Byte und eine doppelte Genauigkeit von 8 Byte definiert.

http://en.wikipedia.org/wiki/Single-precision_floating-point_formathttp://en.wikipedia.org/wiki/Double-precision_floating-point_format

Ich bin mir über die Ausnahmen für diese Fälle nicht sicher.

7
danielfranca

Da Gleitkommaoperationen von CPUs auf einer niedrigen Ebene implementiert werden, schreibt der C++ - Standard keine Größe für float, double oder long double Vor. Es heißt nur, dass die Reihenfolge, in der ich sie spezifiziert habe, gleich oder in zunehmender Reihenfolge der Präzision ist.

Am besten verwenden Sie static_assert, sizeof, typedef und #define Sorgfältig, um plattformübergreifende Gleitkommatypen zu definieren.

4
Bathsheba

Im Fall von X86 werden die internen Berechnungen auch bei Verwendung von IEEE-Zahlen mit einfacher und doppelter Genauigkeit von einem Gleitkomma-Steuerwort (FCW) beeinflusst. Die internen Berechnungen sind normalerweise 64 Bit oder 80 Bit (Long Double). Sie können dies mit Inline-Assembly-Code überschreiben, es gibt jedoch keine Garantie dafür, dass eine Bibliotheksfunktion mit doppelter Genauigkeit dies nicht rückgängig macht.

Microsoft hat mit seinen 16-Bit-Compilern 80-Bit-lange Doubles unterstützt, diese wurden jedoch mit ihren 32-Bit- und 64-Bit-Compilern nicht mehr unterstützt. Lange Doubles sind jetzt die gleichen wie Doubles mit 64-Bit-Compilern.

0
rcgldr

Sie können versuchen, eine Bibliothek zu verwenden, die plattformübergreifende Datentypkompatibilität bietet.

"Die von C geerbten Integraltypen C++ stellen eine plattformübergreifende Gefahr dar. Int, long und friends haben auf verschiedenen Plattformen unterschiedliche Größen (32-Bit und 64-Bit auf heutigen Systemen, möglicherweise 128-Bit später) Bei einigen Anwendungen ist dies möglicherweise irrelevant, da sie niemals die 32-Bit-Grenze erreichen (bzw. 31-Bit, wenn Sie Ganzzahlen ohne Vorzeichen verwenden). Wenn Sie jedoch Ihre Objekte auf einem 64-Bit-System serialisieren und auf einem 32-Bit-System deserialisieren, ist dies möglich sei unangenehm überrascht.
APR bietet eine Reihe von Typedefs für Basistypen, die auf verschiedenen Plattformen unterschiedlich sein können. Diese Typedefs bieten eine garantierte Größe und vermeiden die unscharfen integrierten Typen. Bei einigen Anwendungen (meistens numerisch) ist es jedoch manchmal wichtig, die systemeigene Wortgröße (normalerweise was int bedeutet) zu verwenden, um eine maximale Leistung zu erzielen. "

Gigi SAYFAN - Eigenes Plugin-Framework erstellen (From http://philippe.ameline.free.fr/techytechy/ 071125_PluginFramework.htm )

0
HRold

Ich möchte darauf hinweisen, dass Sie kann nicht sicher sein, dass diese Floats auf verschiedenen Plattformen gleich interpretiert werden, auch wenn Sie die gleiche Größe haben. Sie können viele Artikel über 'Floats over Network' lesen. Der Nicht-Determinismus von Floats ist ein bekanntes Problem.

0
GreenScape