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 mysqlWyjś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.
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.
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.