Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Microsoft C++ (MSVC) överensstämmer med de numeriska IEEE-standarderna. IEEE-754-standarden beskriver flyttalsformat, som är ett sätt att representera reella tal i maskinvara. Det finns minst fem interna format för flyttalsnummer som kan representeras i maskinvara som mål för MSVC-kompilatorn. Kompilatorn använder bara två av dem. Formaten enkel precision (4 byte) och dubbel precision (8 byte) används i MSVC. Enkel precision deklareras med nyckelordet float. Dubbel precision deklareras med nyckelordet double. IEEE-standarden anger även halvprecisionsformat (2 byte) och fyrdubbel precision (16 byte) och ett dubbelutsträckt precisionsformat (10 byte), som vissa C- och C++-kompilatorer implementerar som long double datatyp. I MSVC-kompilatorn long double behandlas datatypen som en distinkt typ, men lagringstypen mappas till double. Det finns dock stöd för inbyggda språk och sammansättningsspråk för beräkningar med hjälp av de andra formaten, inklusive formatet med dubbel utökad precision, där det stöds av maskinvara.
Värdena lagras på följande sätt:
| Värde | Lagras som |
|---|---|
| enkel precision | signbit, 8-bitars exponent, 23-bitars signifikand |
| dubbel precision | sign bit, 11-bitar exponent, 52-bitar signifikand |
I formaten för enkel och dubbel precision antas där en inledande 1 i bråkdelen. Bråkdelen kallas significand (kallas ibland mantissa). Denna inledande 1 lagras inte i minnet, så signifikanderna är faktiskt 24 eller 53 bitar, även om en bit mindre lagras. Formatet med dubbel utökad precision lagrar faktiskt den här biten.
Exponenterna är justerade med hälften av deras möjliga värde. Det innebär att du subtraherar den här biasen från den lagrade exponenten för att hämta den faktiska exponenten. Om den lagrade exponenten är mindre än biasen är det faktiskt en negativ exponent.
Exponenterna är partiska enligt följande:
| Exponent | Påverkad av |
|---|---|
| 8-bitars (enkel precision) | 127 |
| 11-bitar (dubbel-precision) | 1023 |
Dessa exponenter är inte tiornas potenser; de är tvåornas potenser. Det vill: 8-bitars lagrade exponenter kan variera från -127 till 127, lagrade som 0 till 254. Värdet 2127 motsvarar ungefär 1038, vilket är den faktiska gränsen för enkel precision.
Significand lagras som en binär fraktion av formen 1.XXX... . Det här bråket har ett värde som är större än eller lika med 1 och mindre än 2. Verkliga tal lagras alltid i normaliserad form. Det vill säga, significanden är vänsterförskjuten så att den högsta biten av significanden alltid är 1. Eftersom den här biten alltid är 1 antas den (inte lagras) i formaten enkel precision och dubbel precision. Den binära (inte decimal) punkten antas vara bara till höger om inledande 1.
Formatet för flyttalsrepresentation är följande:
| Format | byte 1 | byte 2 | byte 3 | byte 4 | ... | byte n |
|---|---|---|---|---|---|---|
| enkel precision | SXXXXXXX |
XMMMMMMM |
MMMMMMMM |
MMMMMMMM |
||
| dubbel precision | SXXXXXXX |
XXXXMMMM |
MMMMMMMM |
MMMMMMMM |
... | MMMMMMMM |
S representerar teckenbiten, X är de förskjutna exponentbitarna och M är de signifikanta bitarna. Den vänstra biten antas i format med enkel precision och dubbel precision.
Om du vill flytta binärpunkten korrekt tar du först bort exponenten och flyttar sedan binärpunkten till höger eller vänster rätt antal bitar.
Specialvärden
Flyttalsformaten innehåller vissa värden som behandlas särskilt.
Noll
Noll kan inte normaliseras, vilket gör det inte representativt i normaliserad form av ett värde med enkel precision eller dubbel precision. Ett speciellt bitmönster av alla nollor representerar 0. Det går också att representera -0 som noll med satt teckenbit, men -0 och 0 jämförs alltid som lika.
Oändligheter
Värdena +∞ och −∞ representeras av en exponent som består av enbart ettor och en significand som består av enbart nollor. Positiva och negativa representeras med hjälp av teckenbiten.
Undernormala
Det är möjligt att representera tal av mindre storlek än det minsta talet i normaliserad form. De kallas för subnormala eller denormala tal. Om exponenten består av enbart nollor och significanden är icke-noll, anses den implicita inledande biten av significanden vara en noll, inte en etta. Precisionen för subnormala tal minskar när antalet inledande nollor i significand ökar.
NaN – inte ett tal
Det går att representera värden som inte är verkliga tal, till exempel 0/0, i IEEE-flyttalsformatet. Ett värde av den här typen kallas NaN. Ett NaN representeras av en exponent av alla och en significand som inte är noll. Det finns två typer av NaNs, tyst NaN eller QNaN och signalering av NaN eller SNaN. Quiet NaNs har en ledande i significand och sprids genom ett uttryck. De representerar ett obestämt värde, till exempel resultatet av att dividera med oändligheten eller multiplicera en oändlighet med noll. Signalering NaN:er har en inledande nolla i betydelsedelen. De används för åtgärder som inte är giltiga för att signalera ett undantag för flyttalsmaskinvara.
Exempel
Följande är några exempel i enkelprecisionsformat:
För värdet 2 är teckenbiten noll. Den lagrade exponenten är 128, eller 1000 0000 i binärt, vilket är 127 plus 1. Den lagrade binära significand är (1.) 000 0000 0000 0000 0000 0000, som har en underförstådd ledande 1 och binär punkt, så den faktiska significand är en.
Värde Formel Binär representation Hexadecimal 2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000 Värdet -2. Samma som +2 förutom att teckenbiten har angetts. Samma sak gäller för det negativa av alla flyttalsnummer i IEEE-format.
Värde Formel Binär representation Hexadecimal -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000 Värdet 4. Samma significand, exponent ökar med en (förskjutet värde är 129, eller 100 0000 1 i binärt).
Värde Formel Binär representation Hexadecimal 4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000 Värdet 6. Samma exponent, significand är större med hälften. Det är (1.) 100 0000 ... 0000 0000, vilket, eftersom det är en binär fraktion, är 1 1/2 eftersom värdena för bråktalssiffrorna är 1/2, 1/4, 1/8 och så vidare.
Värde Formel Binär representation Hexadecimalt 6 1,5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000 Värdet 1. Samma significand som andra krafter av två, den partiska exponenten är en mindre än två vid 127, eller 011 1111 1 i binär.
Värde Formel Binär representation Hexadecimal 1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000 Värdet 0,75. Den partiska exponenten är 126, 011 1111 0 i binärt, och significand är (1.) 100 0000 ... 0000 0000, vilket är 1 1/2.
Värde Formel Binär representation Hexadecimal 0.75 1,5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000 Värdet 2,5. Exakt samma som två förutom att den bit som representerar 1/4 anges i significand.
Värde Formel Binär representation Hexadecimal 2,5 1,25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000 1/10 är ett upprepande bråk i binärt format. Significand är lite mindre än 1,6, och den partiska exponenten säger att 1,6 ska delas med 16. (Det är 011 1101 1 i binärt värde, vilket är 123 i decimaltecken.) Den sanna exponenten är 123 - 127 = -4, vilket innebär att faktorn som multipliceras är 2-4 = 1/16. Den lagrade significand avrundas upp i den sista biten i ett försök att representera det icke-representativa talet så exakt som möjligt. (Anledningen till att 1/10 och 1/100 inte exakt kan representeras i binärt format liknar anledningen till att 1/3 inte exakt kan representeras i decimaltecken.)
Värde Formel Binär representation Hexadecimal 0,1 1,6 * 2–4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD Noll är ett specialfall. Den använder formeln för det minsta möjliga representerande positiva värdet, vilket är alla nollor.
Värde Formel Binär representation Hexadecimal 0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000