logo

C Float och Double

Flyta och dubbel är två primitiva datatyper i C-programmering som används för att lagra decimala värden . De lagrar båda flyttalsnummer men de skiljer sig åt i vilken precisionsnivå de kan lagra värdena till.

I den här artikeln kommer vi att studera var och en av dem i detalj, deras minnesrepresentation och skillnaden mellan dem.



Flyta

Float används för att lagra flyttalstal med en precision. Den kan lagra decimalvärden med precision upp till 6-7 decimaler.

Syntax

 float var_name ;>
  • Storleken på flottören är 4 bytes.
  • Float kan lagra värden som varierar från 3,4 x 10-38till 3,4 x 1038.
  • Den kan lagra värden upp till 7 decimaler utan förlust av precision.
  • Formatspecifikationen för float är %f.

Exempel

C




mittknapp i css





// C Program to illustrate float> #include> > int> main()> {> >// Syntax of declaring and initializing> >// the float variable> >float> myVariable = 789.123456f;> > >// printing floating point number> >printf>(>'Float value is %f'>, myVariable);> >return> 0;> }>

>

konstruktör i java

>

Produktion

Float value is 789.123474>

Som du kan se i ovanstående utdata går precisionen för decimaltal förlorad efter den 7:e siffran på grund av de begränsade bitarna i float. I dessa fall rekommenderas en dubbel datatyp.

Notera: Alla realtalsliteralerna är av dubbel typ som standard. Vi kan lägga till en f i slutet av bokstaven för att definiera den som flyttyp.

Dubbel

Dubbel används för att lagra flyttalsvärden med dubbla precision. Det är den större versionen av float som kan lagra reella tal med precision upp till 15 decimaler.

java arraylist sortering
  • Storleken på det dubbla är 8 byte.
  • Utbudet av dubbla är 1,7×10-308till 1,7×10+308.
  • Den kan lagra värden upp till 15 decimaler utan förlust av precision.
  • Formatspecifikationen för dubbel är %lf

Exempel

C




#include> > int> main()> {> >// Syntax of declaring and initializing> >// the double variable> >double> myVariable = 789.123456;> >printf>(>'Double value is %lf'>, myVariable);> >//%lf or %f both can be used to> >// print Float values> >return> 0;> }>

>

>

Produktion

samlingar i java
Double value is 789.123456>

Hur lagras float och double?

C-språket följer IEEE 754 standard för att representera flyttalsvärden i minnet. Till skillnad från int-typen som är direkt lagrad i minnet i binär form, delas flytvärdena upp i två delar: exponent och mantissa, och lagras sedan.

Enligt IEEE 754 består flyttalsvärdena av tre komponenter:

    Teckenbit: Detta representerar numrets tecken. 0 representerar positivt medan 1 representerar negativt. Biased Exponent: Exponenten för talet kan inte lagras direkt eftersom den kan vara både negativ eller positiv, så vi använder en partisk exponent där vi lägger till en viss bias till exponenten. Normaliserad mantissa: Matissa är talet i vetenskaplig notation, dvs precisionsbitar av talet.

C float Minnesrepresentation

Storleken på flottören är 32-bitars, varav:

    Den mest signifikanta biten (MSB) används för att lagra skylt av numret.
  • Nästa 8 bitar används för att lagra exponent.
  • De återstående 23 bitar används för att lagra mantissa.
minnesrepresentation av float

Exempel

Låt oss ta 65,125 som ett decimaltal som vi vill lagra i minnet.

Converting to Binary form, we get: 65 = 1000001 0.125 = 001 So, 65.125 = 1000001.001 = 1.000001001 x 106 Normalized Mantissa = 000001001 Now, according to the standard, we will get the baised exponent by adding the exponent to 127, = 127 + 6 = 133 Baised exponent = 10000101 And the signed bit is 0 (positive) So, the IEEE 754 representation of 65.125 is, 0 10000101 00000100100000000000000>

C dubbel minnesrepresentation

Storleken på flottören är 32-bitars, varav:

    Den mest signifikanta biten (MSB) används för att lagra skylt av numret.
  • Nästa 11 bitar används för att lagra exponent.
  • De återstående 52 bitar används för att lagra mantissa.
minnesrepresentation av dubbel

Exempel

np.nollor

Låt oss ta exemplet med samma nummer 65.125,

From above, 65.5 = 1.000001001 x 106 Normalized Mantissa = 000001001 Now, according to the standard, bais is 1023. So, = 1023 + 6 = 1029 Baised exponent = 10000000101 And the signed bit is 0 (positive) So, the IEEE 754 representation of 65.125 is, 0 10000000101 0000010010000000000000000000000000000000000000000000>

Skillnader mellan float och double

Poäng

Flyta

Dubbel

Precision Float är IEEE 754 flyttal med enkel precision som ger precision upp till 7 decimaler. Dubbel är dubbel precision IEEE 754 flyttal som ger precision upp till 15 decimaler.
Minnesanvändning Float använder 32 bitar eller 4 byte minne. Dubbel använder 64 bitar eller 8 byte minne.
Räckvidd Float kan lagra värden som varierar från 3,4 x 10-38till 3,4 x 10+38. Räckvidden för dubbel är 1,7×10-308till 1,7×10+308.
Formatspecifikation %f är formatspecifikationen för float. %lf är formatspecifikationen för dubbel.
Minnesrepresentation Tecken = 1 bit
Exponent = 8 bitar
Mantissa = 23 bitar
Tecken = 1 bit
Exponent = 11 bitar
Mantissa = 52 bitar

Slutsats

Sammanfattningsvis använder C både float och dubbel för decimaltal, men de varierar när det gäller precision, minnesanvändning, räckvidd och hastighet. När utrymmet är begränsat och precisionen kan äventyras är det bättre att använda float där, medan dubbel används för högprecisionsapplikationer där utrymme inte är ett problem. Det är viktigt att välja lämplig datatyp baserat på applikationens krav.