logo

C Float i Double

Platforma I podwójnie to dwa prymitywne typy danych w programowaniu C, które służą do przechowywania wartości dziesiętne . Obydwa przechowują liczby zmiennoprzecinkowe, ale różnią się poziomem precyzji, z jaką mogą przechowywać wartości.

W tym artykule szczegółowo przestudiujemy każdy z nich, ich reprezentację w pamięci i różnicę między nimi.



Platforma

Float służy do przechowywania liczb zmiennoprzecinkowych o pojedynczej precyzji. Może przechowywać wartości dziesiętne z dokładnością do 6-7 miejsc po przecinku.

Składnia

 float var_name ;>
  • Rozmiar pływaka wynosi 4 bajty.
  • Float może przechowywać wartości różne od 3,4x10-38do 3,4x 1038.
  • Może przechowywać wartości do 7 miejsc po przecinku bez utraty precyzji.
  • Specyfikatorem formatu float jest %F.

Przykład

C




jednorodna mieszanina





// 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;> }>

>

>

pokaż użytkownikom mysql
Wyjście

Float value is 789.123474>

Jak widać na powyższym wyjściu, precyzja liczb dziesiętnych jest tracona po siódmej cyfrze z powodu ograniczonej liczby bitów w zmiennoprzecinkowej. W takich przypadkach zalecany jest podwójny typ danych.

Notatka: Wszystkie literały liczb rzeczywistych są domyślnie typu podwójnego. Możemy dołączyć F na końcu literału, aby zdefiniować go jako typ zmiennoprzecinkowy.

Podwójnie

Double służy do przechowywania wartości zmiennoprzecinkowych o podwójnej precyzji. Jest to większa wersja float, która może przechowywać liczby rzeczywiste z dokładnością do 15 miejsc po przecinku.

  • Rozmiar podwójnego wynosi 8 bajtów.
  • Zakres podwójnego wynosi 1,7×10-308do 1,7×10+308.
  • Może przechowywać wartości do 15 miejsc po przecinku bez utraty precyzji.
  • Specyfikatorem formatu dla double jest %lf

Przykład

C


właściwości kwasowe



#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;> }>

przerwa w Javie

>

>

Wyjście

Double value is 789.123456>

Jak przechowywane są float i double?

Język C podąża za Standard IEEE754 do reprezentowania wartości zmiennoprzecinkowych w pamięci. W przeciwieństwie do typu int, który jest bezpośrednio przechowywany w pamięci w postaci binarnej, wartości zmiennoprzecinkowe są dzielone na dwie części: wykładnik i mantysa, a następnie zapisywane.

Zgodnie z IEEE 754 wartości zmiennoprzecinkowe składają się z 3 elementów:

    Bit znaku: reprezentuje znak liczby. 0 oznacza wartość dodatnią, a 1 oznacza wartość ujemną. Wykładnik obciążony: Wykładnika liczby nie można bezpośrednio zapisać, ponieważ może być zarówno ujemny, jak i dodatni, dlatego używamy wykładnika obciążonego, gdy dodajemy pewne obciążenie do wykładnika. Znormalizowana mantysa: Matissa to liczba w notacji naukowej, tj. bitach precyzji liczby.

C float Reprezentacja pamięci

Rozmiar float wynosi 32-bity, z czego:

ipconfig na Ubuntu
    Najbardziej znaczący bit (MSB) służy do przechowywania podpisać numeru.
  • Następny 8 bitów służą do przechowywania wykładnik potęgowy.
  • Pozostałe 23 bity służą do przechowywania mantysa.
reprezentacja pamięciowa float

Przykład

Przyjmijmy 65,125 jako liczbę dziesiętną, którą chcemy zapisać w pamięci.

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 podwójna reprezentacja pamięci

Rozmiar float wynosi 32-bity, z czego:

    Najbardziej znaczący bit (MSB) służy do przechowywania podpisać numeru.
  • Następny 11 bitów służą do przechowywania wykładnik potęgowy.
  • Pozostałe 52 bity służą do przechowywania mantysa.
reprezentacja pamięciowa double

Przykład

Weźmy przykład tej samej liczby 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>

Różnice między floatem a double

Zwrotnica

Platforma

Podwójnie

Precyzja Float to liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE 754, która zapewnia precyzję do 7 miejsc dziesiętnych. Double to zmiennoprzecinkowy standard IEEE 754 o podwójnej precyzji, który zapewnia precyzję do 15 miejsc dziesiętnych.
Zużycie pamięci Float wykorzystuje 32 bity lub 4 bajty pamięci. Double wykorzystuje 64 bity lub 8 bajtów pamięci.
Zakres Float może przechowywać wartości od 3,4 x 10-38do 3,4x10+38. Zakres podwójnego wynosi 1,7 × 10-308do 1,7×10+308.
Specyfikator formatu %F jest specyfikatorem formatu float. %lf jest specyfikatorem formatu dla double.
Reprezentacja pamięci Znak = 1 bit
Wykładnik = 8 bitów
Mantysa = 23 bity
Znak = 1 bit
Wykładnik = 11 bitów
Mantysa = 52 bity

Wniosek

Podsumowując, C używa zarówno liczb zmiennoprzecinkowych, jak i podwójnych dla liczb dziesiętnych, ale różnią się one pod względem precyzji, wykorzystania pamięci, zasięgu i szybkości. Gdy przestrzeń jest ograniczona i precyzja może być zagrożona, lepiej jest użyć tam pływaka, natomiast podwójne jest używane w zastosowaniach wymagających dużej precyzji, gdzie przestrzeń nie stanowi problemu. Istotne jest, aby wybrać odpowiedni typ danych w oparciu o wymagania aplikacji.