Hoe groot is float en double in C en C++?

Ik was aan het kijken of er een standaardtype is vergelijkbaar met uint32_tdat altijd zou worden toegewezen aan een 32-bits niet-ondertekend integraal type, maar ik kon er geen vinden.

Is de grootte van floataltijd 4 byte op alle platforms?
Is de grootte van doublealtijd 8?

Zeggen beide standaarden er iets over?

Ik wil ervoor zorgen dat mijn maat altijd hetzelfde is op alle platforms (x86 en x64), dus ik gebruik standaard int-typen, maar ik kon geen vergelijkbare typedef vinden voor floaten double.


Antwoord 1, autoriteit 100%

Uittreksel uit de C99-standaard, normatieve bijlage F (De C++-standaard vermeldt deze bijlage niet expliciet, hoewel deze alle betrokken functies zonder wijziging per referentie omvat. Ook moeten de typen overeenkomen voor compatibiliteit.):

IEC 60559 drijvende-kommaberekening

F.1 Inleiding

1 Deze bijlage specificeert C-taalondersteuning voor de IEC 60559 floating-point-standaard. De
IEC 60559 floating-point standaard is specifiek binaire floating-point rekenkunde voor
microprocessorsystemen, tweede editie (IEC 60559:1989), voorheen aangeduid als
IEC 559:1989 en als IEEE-standaard voor binaire drijvende-komma-rekenkunde
(ANSI/IEEE 754-1985). IEEE-standaard voor radix-onafhankelijke drijvende komma
Rekenkunde (ANSI/IEEE 854−1987) generaliseert de te verwijderen binaire standaard
afhankelijkheden van radix en woordlengte. IEC 60559 verwijst in het algemeen naar de drijvende-komma
standaard, zoals in IEC 60559-werking, IEC 60559-indeling, enz. Een implementatie die:
definieert __STDC_IEC_559__moet voldoen aan de specificaties in deze bijlage.356)
Waar een binding tussen de C-taal en IEC 60559 wordt aangegeven, is de
IEC 60559-gespecificeerd gedrag wordt als referentie aangenomen, tenzij anders vermeld. Sinds
negatieve en positieve oneindigheid zijn representatief in IEC 60559-formaten, alle reële getallen liegen
binnen het bereik van representatieve waarden.

Dus, voeg <math.h>toe (of in C++ misschien <cmath>), en test op __STDC_IEC_559__.

Als de macro is gedefinieerd, zijn niet alleen de typen beter gespecificeerd (floatis onder andere 32bits en doubleis 64bits), maar ook het gedrag van ingebouwde operators en standard-functions is meer gespecificeerd.
Het ontbreken van de macro geeft geen enkele garantie.

Voor x86 en x86_64 (amd64), kunt u erop vertrouwen dat de typen floaten doubleIEC-60559-conform zijn, hoewel functies die ze gebruiken en bewerkingen daarop mogelijk niet zijn.


Antwoord 2, autoriteit 76%

Zegt niets over de maat.

3.9.1.8

Er zijn drie typen drijvende komma: zwevend, dubbel en lang dubbel.
Het type double geeft minstens evenveel precisie als float, en de
type long double biedt minstens zoveel precisie als double. De
set van waarden van het type float is een subset van de set van waarden van
het type dubbel; de reeks waarden van het type double is een subset van
de reeks waarden van het type long double. De waarderepresentatie van
typen met drijvende komma is door de implementatie gedefinieerd. Integraal en zwevend
typen worden gezamenlijk rekenkundige typen genoemd. Specialisaties van de
standaardsjabloon std::numeric_limits (18.3) specificeert het maximum
en minimumwaarden van elk rekenkundig type voor een implementatie.


Antwoord 3, autoriteit 71%

De C++ -standaard zegt niets, maar in de meeste platforms gebruiken C++ de standaard / dubbele precisienorm van IEEE, die enkele precisie definiëren als 4 bytes en dubbele precisie als 8 bytes.

http://en.wikipedia.org/wiki/single-precision_floating-point_format
http://en.wikipedia.org/wiki/double-precision_floating-point_format

Ik ben niet zeker van de uitzonderingen voor deze gevallen.


Antwoord 4, Autoriteit 24%

Naarmate het drijvende puntbewerkingen op een laag niveau door CPU’s worden geïmplementeerd, mandeert de C++ -standaard geen maat voor een float, doubleof long double. Alles wat het zegt is dat de bestelling die ik heeft opgegeven in gelijke of toenemende volgorde van precisie.

Uw beste gok is het gebruik static_assert, sizeof, typedefen #definezorgvuldig om te definiëren Cross Platform Drijvende punten.


Antwoord 5, Autoriteit 6%

Ik wil erop wijzen dat, zelfs als u dezelfde grootte hebt die u kan drijven, niet Zorg ervoor dat deze drijvers op verschillende platforms even worden geïnterpreteerd. Je kunt veel papieren lezen over ‘drijft over netwerk’. Drijft niet-determinisme is een bekend probleem.


Antwoord 6

U kunt proberen een bibliotheek te gebruiken die directe gegevenstypenscompatibiliteit biedt.

“De integrale typen C++ geërfd van C zijn een cross-platform-gevaar. Int, lang en vrienden hebben verschillende maten op verschillende platforms (32-bits en 64-bits op de systemen van vandaag, misschien 128-bits later) . Voor sommige toepassingen lijkt het misschien irrelevant omdat ze nooit de 32-bits limiet (of eerder 31-bit benaderen als u niet-ondertekende gehele getallen gebruikt), maar als u uw objecten op een 64-bits systeem en deserialize op een 32-bits systeem gebruikt je bent misschien onaangenaam verrast.
APR biedt een reeks typedefs voor basistypen die kunnen verschillen op verschillende platforms. Deze typedefs bieden een gegarandeerde grootte en vermijden de fuzzy-ingebouwde typen. Voor sommige toepassingen (meestal numeriek) is het soms belangrijk om de Word-formaat van de inheemse machine te gebruiken (meestal waart u in staat) om maximale prestaties te bereiken. “

Gigi Sayfan – Bouw uw eigen plug-in kader (van http://philippe.ameline.free.fr/techytechy/071125_pluginframework.htm )


Antwoord 7

In het geval van X86, zelfs als het gebruik van IEEE-enkele en dubbele precisie-nummers, worden de interne berekeningen beïnvloed door een drijvend puntbesturingswoord (FCW). De interne berekeningen zijn normaal 64 bit of 80 bit (lang dubbel). U kunt dit overschrijven met Inline Assembly Code, maar er is geen garantie dat sommige Double Precision Library-functie het niet terug zal instellen.

Microsoft ondersteunde 80 bit lange doubles met hun 16-bits compilers, maar viel de steun voor hen af ​​met hun 32-bits en 64 bit compilers, en lange doubles zijn nu hetzelfde als verdubbeld op 64 bits.

Other episodes