floating-pointKomma igång med flytande punkt


Anmärkningar

Det här avsnittet ger en översikt över vad flytande punkt är och varför en utvecklare kanske vill använda den.

Det bör också nämna alla stora ämnen inom flytpunkten och koppla till relaterade ämnen. Eftersom dokumentationen för flytande punkt är ny, kan du behöva skapa initialversioner av relaterade ämnen.

Översikt

Vad är flytande punkt?

Det finns två typer av siffror:

  • fast punkt där ett visst antal siffror är tillgängliga före och efter radixpunkten.
  • flytpunkt där ett visst antal siffror är tillgängliga för mantissen och för exponenten.

Ett exempel med decimalsiffror med tre decimaler före decimalpunkten och två decimaler efter decimalplatsen:

  • 0 skulle representeras som 000,00
  • 0,123 skulle representeras som 000,12
  • 0,00123 skulle representeras som 000,00
  • 1 skulle representeras som 001,00
  • 1.123 skulle representeras som 001.12
  • 1.00123 skulle representeras som 001,00
  • 123.456 skulle representeras som 123.45
  • 1234.56 är ett fel eftersom det skulle lagras som 234.56 och det är bara fel

Ett exempel med decimalsiffror med fem decimaler för mantissen och en decimal för exponenten:

  • 0 kan representeras som .00000 x 10 ^ 0
  • 0,1 kan representeras som .10000 x 10 ^ 0
  • 0.0000123456 kan representeras som .12345 x 10 ^ -4
  • 0.000000000123456 kan representeras som .12345 x 10 ^ -9
  • 0.00000000001 är ett fel eftersom exponenten inte är tillräckligt stor för att lagra numret
  • 1 kan representeras som .10000 x 10 ^ 1
  • 1.123 kan representeras som .11230 x 10 ^ 1
  • 1.00123 kan representeras som .10012 x 10 ^ 1
  • 123.45678 kan representeras som .12345 x 10 ^ 2
  • 123456789.1 kan representeras som .12345 x 10 ^ 9
  • 1000000000 är ett fel eftersom exponenten inte är tillräckligt stor för att lagra numret

Så ett flytande punktnummer kan representera siffror med mycket olika storlekar (0.000000000123456 och 123456789.1) med samma mängd relativ noggrannhet.

Fasta punktsnummer är användbara när ett visst antal decimaler alltid behövs oavsett storleken på antalet (till exempel pengar). Flyttalsnummer är användbara när storleken varierar och noggrannhet fortfarande behövs. Till exempel: för en vägingenjör mäts avstånd i meter och 0,01 av en meter är obetydlig, men för en mikrochipdesigner är skillnaden mellan 0,0000100 meter och .000000001 meter enorm - och en fysiker kan behöva använda enorma antal och mycket, mycket små siffror i samma beräkning. Noggrannhet i många olika storlekar är det som gör flytande punktnummer användbara.

Hur det fungerar

Datorer använder inte decimal - de använder binärt och det orsakar problem för flytande punkt eftersom inte alla decimaler kan representeras exakt med ett flytande punktnummer och som introducerar avrundningsfel i beräkningarna.

Efter att ha gjort alla exemplen i decimal är det viktigt att notera att eftersom de är binära istället för att lagra ett flytande punktnummer som en summa av decimalbråk:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3
 

datorer lagrar flytande punktnummer som en summa av binära fraktioner:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3
 

Det finns många olika sätt att lagra bitpatroner som representerar dessa bråk, men den som de flesta datorer använder nu är baserad på IEEE-754-standarden. Den har regler för lagring av både decimal- och binärrepresentation och för datatyper av olika storlek.

Det sätt som normala nummer lagras med IEEE-standarden är:

  • en bit för tecknet - lagrat i MSB, 1 betyder negativt och 0 betyder positivt
  • vissa bitar för exponenten - förspänningen subtraheras för att få både positiva och negativa exponenter
  • några bitar för mantissen - siffror efter decimalplatsen med en implicit 1 före decimalplatsen.

För att möjliggöra ett mer gradvis underflöde behandlas denormaliserade siffror (när exponentbitarna är alla noll) speciellt: exponenten är inställd på -126 och den implicita ledningen 1 innan decimalplatsen läggs INTE till mantissen.

32-bitars IEEE-754 flytande punktnummer

För ett normalt 32-bitars IEEE-754 flytande punktnummer:

  • bit 32 är tecknet
  • bitarna 24-31 är exponenten - förspänningen är 127
  • bitarna 1-23 är mantissen

Så ett normalt antal beräknas som:

-1^sign * 2^(exponent-bias) * 1.mantissa
 

Om bitmönstret var:

0 10000101 11101111100000000000000
 

Då är värdet:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875
 

Det finns några specialvärden:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero
 

Specifikationer för 32-bitars IEEE-754-formatet finns på: