Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Microsoft C++ (MSVC) is consistent met de numerieke IEEE-standaarden. De IEEE-754-standaard beschrijft drijvende-komma-indelingen, een manier om reële getallen in hardware weer te geven. Er zijn ten minste vijf interne indelingen voor drijvendekommagetallen die kunnen worden weergegeven in hardware waarop de MSVC-compiler is gericht. De compiler gebruikt er slechts twee. De notaties met enkele precisie (4 bytes) en dubbele precisie (8 bytes) worden gebruikt in MSVC. Eén precisie wordt gedeclareerd met behulp van het trefwoord float. Dubbele precisie wordt gedeclareerd met behulp van het trefwoord double. De IEEE-standaard geeft ook indelingen voor halve precisie (2-byte) en viervoudige precisie (16-bytes) en een indeling met dubbele uitgebreide precisie (10-byte) op, die sommige C- en C++-compilers als het long double gegevenstype implementeren. In de MSVC-compiler wordt het long double gegevenstype beschouwd als een uniek type, maar het opslagtype wordt toegewezen aan double. Er is echter ondersteuning voor intrinsieke functies en assemblytaal voor berekeningen met behulp van de andere indelingen, waaronder de dubbele uitgebreide precisie-indeling, waar deze door hardware wordt ondersteund.
De waarden worden als volgt opgeslagen:
| Waarde | Opgeslagen als |
|---|---|
| enkelvoudige precisie | tekenbit, 8 bit exponent, 23 bit mantisse |
| dubbele precisie | sign bit, 11-bit exponent, 52-bit mantisse |
In notaties met enkele precisie en dubbele precisie is er een veronderstelde voorloop 1 in het fractiedeel. Het breukdeel wordt de significand genoemd (ook de mantissa genoemd). Deze voorloop 1 wordt niet opgeslagen in het geheugen, dus de significanden zijn eigenlijk 24 of 53 bits, ook al wordt er een bit minder opgeslagen. De dubbele uitgebreide precisie-indeling slaat deze bit daadwerkelijk op.
De exponenten zijn vertekend door een offset van de helft van hun mogelijke waarde. Dit betekent dat u deze vooroordelen van de opgeslagen exponent aftrekken om de werkelijke exponent op te halen. Als de opgeslagen exponent kleiner is dan de bias, is het eigenlijk een negatieve exponent.
De exponenten zijn als volgt vertekend:
| Exponenten | Bevooroordeeld door |
|---|---|
| 8-bit (enkelvoudige precisie) | 127 |
| 11-bit (dubbele precisie) | 1023 |
Deze exponenten zijn geen machten van tien; ze zijn machten van twee. Dat wil gezegd: 8-bits opgeslagen exponenten kunnen variëren van -127 tot 127, opgeslagen als 0 tot 254. De waarde 2127 is ongeveer gelijk aan 1038, wat de werkelijke limiet van één precisie is.
Het teken wordt opgeslagen als een binair deel van het formulier 1.XXX... . Deze breuk heeft een waarde groter dan of gelijk aan 1 en kleiner dan 2. Reële getallen worden altijd opgeslagen in genormaliseerde vorm. Dat wil zeggen, de significand wordt naar links verschoven, zodat de hoogst gerangschikte bit van de significand altijd 1 is. Omdat deze bit altijd 1 is, wordt ervan uitgegaan (niet opgeslagen) in de enkel- en dubbelprecisieformaten. Het binaire (niet decimale) punt wordt verondersteld direct rechts van het leidende cijfer 1 te staan.
De indeling voor drijvende-komma presentatie is als volgt:
| Formaat | byte 1 | byte 2 | byte 3 | byte 4 | ... | byte n |
|---|---|---|---|---|---|---|
| enkelvoudige precisie | SXXXXXXX |
XMMMMMMM |
MMMMMMMM |
MMMMMMMM |
||
| dubbele precisie | SXXXXXXX |
XXXXMMMM |
MMMMMMMM |
MMMMMMMM |
... | MMMMMMMM |
S vertegenwoordigt de teken-bit, de X's zijn de vertekende exponent bits en de M's zijn de significand bits. De meest linkse bit wordt verondersteld in formaten met enkele precisie en dubbele precisie.
Als u het binaire punt naar behoren wilt verplaatsen, moet u eerst de exponent loskoppelen en vervolgens het binaire punt naar rechts of links het juiste aantal bits verplaatsen.
Speciale waarden
De formaten voor drijvende komma bevatten enkele waarden die speciaal worden behandeld.
Nul
Nul kan niet worden genormaliseerd, waardoor deze niet kan worden weergegeven in de genormaliseerde vorm van één precisie of dubbele precisiewaarde. Een speciaal bitpatroon van alle nullen vertegenwoordigt 0. Het is ook mogelijk om -0 als nul weer te geven met de tekenbitset, maar -0 en 0 vergelijken altijd als gelijk.
Oneindigheden
De waarden +∞ en −∞ worden vertegenwoordigd door een exponent van alle waarden, en een teken dat alle nullen is. Positief en negatief worden gerepresenteerd met behulp van de tekenbit.
Subnormale waarden
Het is mogelijk om getallen van kleinere grootte weer te geven dan het kleinste getal in genormaliseerde vorm. Ze worden subnormale of denormale getallen genoemd. Als de exponent alle nullen is en de significand niet nul is, wordt het impliciete voorloopbit van de significand als nul beschouwd, niet als één. De precisie van subnormale getallen neemt af naarmate het aantal voorloopnullen in de mantisse toeneemt.
NaN - Geen getal
Het is mogelijk om waarden weer te geven die geen reële getallen zijn, zoals 0/0, in de IEEE-drijvendekomma-indeling. Een waarde van dit type wordt een NaN genoemd. Een NaN wordt vertegenwoordigd door een exponent van alle enen en een niet-nul-teken. Er zijn twee soorten NaNs, stille NaNs of QNaNs, en signalerende NaNs of SNaNs. Stille NaN's hebben een voorloopteken en worden doorgegeven via een expressie. Ze vertegenwoordigen een onbepaalde waarde, zoals het resultaat van het delen door oneindigheid of het vermenigvuldigen van een oneindigheid met nul. Signalerende NaNs hebben een voorloopnul in de significand. Ze worden gebruikt voor bewerkingen die niet geldig zijn, om een drijvende-kommahardware-uitzondering aan te geven.
Voorbeelden
Hier volgen enkele voorbeelden in enkelvoudige precisienotatie:
Voor de waarde 2 is de teken-bit nul. De opgeslagen exponent is 128, of 1000 0000 in binaire code, dat 127 plus 1 is. Het opgeslagen binaire teken is (1.) 000 0000 0000 0000 0000 0000, dat een impliciet voorlooppunt 1 en binair punt heeft, dus de werkelijke significand is er een.
Waarde Formule Binaire weergave Hexadecimaal 2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000 De waarde -2. Hetzelfde als +2, behalve dat de tekenbit is ingesteld. Ditzelfde geldt voor de negatieven van alle IEEE-indeling drijvende-komma-getallen.
Waarde Formule Binaire weergave Hexadecimaal -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000 De waarde 4. Hetzelfde betekenis, exponent neemt met één toe (vertekeningswaarde is 129, of 100 0000 1 in binaire code).
Waarde Formule Binaire weergave Hexadecimaal 4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000 De waarde 6. Zelfde exponent, significand is met de helft groter. Het is (1.) 100 0000 ... 0000 0000, die, omdat het een binaire breuk is, 1 1/2 is, omdat de waarden van de breukcijferen 1/2, 1/4, 1/8 enzovoort zijn.
Waarde Formule Binaire weergave Hexadecimaal 6 1,5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000 De waarde 1. Hetzelfde teken en andere machten van twee, de vertekende exponent is één minder dan twee bij 127, of 011 1111 1 in binair.
Waarde Formule Binaire weergave Hexadecimaal 1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000 De waarde 0,75. De vertekende exponent is 126, 011 1111 0 in binair, en het tekenteken is (1.) 100 0000 ... 0000 0000, dat is 1 1/2.
Waarde Formule Binaire weergave Hexadecimaal 0.75 1,5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000 De waarde 2,5. Precies hetzelfde als twee, behalve dat de bit die 1/4 vertegenwoordigt, is ingesteld in de ondertekening.
Waarde Formule Binaire weergave Hexadecimaal 2,5 1,25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000 1/10 is een herhalende breuk in het binaire stelsel. De significand is iets minder dan 1,6 en de verschoven exponent zegt dat 1,6 moet worden gedeeld door 16. (Het is 011 1101 1 in binair, dat is 123 in decimalen.) De werkelijke exponent is 123 - 127 = -4, wat betekent dat de factor waarmee moet worden vermenigvuldigd 2-4 = 1/16 is. Het opgeslagen teken wordt in de laatste bit naar boven afgerond in een poging om het onvertegenwoordigde getal zo nauwkeurig mogelijk weer te geven. (De reden dat 1/10 en 1/100 niet exact kunnen worden aangegeven in het binaire bestand, is vergelijkbaar met de reden dat 1/3 niet exact in decimalen kan worden weergegeven.)
Waarde Formule Binaire weergave Hexadecimaal 0,1 1,6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD Zero is een speciaal geval. De formule wordt gebruikt voor de minimaal mogelijke vertegenwoordigbare positieve waarde, die alle nullen is.
Waarde Formule Binaire weergave Hexadecimaal 0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000