W tym samouczku dowiemy się o typach danych typu float i double na podstawie przykładów. Przyjrzymy się również niektórym kluczowym różnicom między nimi i kiedy ich używać.
W C ++ oba typy danych float
i double
są używane dla wartości zmiennoprzecinkowych. Liczby zmiennoprzecinkowe są używane jako wartości dziesiętne i wykładnicze . Na przykład,
// creating float type variables float num1 = 3.0f; float num2 = 3.5f; float num3 = 3E-5f; // 3x10^-5 // creating double type variables double num4 = 3.0; double num5 = 3.5; double num6 = 3E-5; // 3x10^-5
Musimy dodać przyrostek f
lub F
na końcu float
wartości. Dzieje się tak, ponieważ kompilator interpretuje wartości dziesiętne bez sufiksu jako double
.
Rozważ ten kod.
float a = 5.6;
Tutaj przypisaliśmy double
wartość float
zmiennej.
W takim przypadku kompilator automatycznie konwertuje do wersji 5.6 , float
zanim zostanie przypisana do zmiennej a. Może to spowodować utratę danych. Aby dowiedzieć się więcej, odwiedź stronę Konwersja typu C ++.
Różnica między float i double
pływak | podwójnie |
---|---|
Rozmiar: 4 bajty | Rozmiar: 8 bajtów |
Precyzja: ogólnie dokładność do 7 cyfr dziesiętnych | Precyzja: ogólnie dokładność do 15 cyfr dziesiętnych |
Przykład: 3.56f , 3e5f etc. | Przykład: 3.56 , 3e5 etc. |
Uwaga: Jeśli nie masz określonych wymagań, zawsze używaj double
zamiast float
, ponieważ float
zmienne mogą wprowadzać błędy podczas pracy z dużymi liczbami.
Przykład 1: C ++ float i double
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Printing the two variables cout << "Double Type Number = " << a << endl; cout << "Float Type Number = " << b << endl; return 0; )
Wynik
Podwójny numer typu = 3,91235 Liczba typu zmiennoprzecinkowego = 3,91235
Uwaga: kompilator użyty w tym przykładzie (kompilator MinGW) zezwalał na 6 cyfr. Zatem nasze wartości zmiennych zostały zaokrąglone i obcięte do 6 cyfr przez kompilator.
setprecision (), aby określić punkty dziesiętne
Za cout
pomocą setprecision()
funkcji możemy określić liczbę miejsc dziesiętnych do wydrukowania .
Ta funkcja jest zdefiniowana w iomanip
pliku nagłówkowym, który oznacza manipulację wejściem / wyjściem .
Przykład 2: Używanie setprecision () dla liczb zmiennoprzecinkowych
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Setting the precision to 12 decimal places cout << setprecision(13); // Printing the two variables cout << "Double Type Number = " << a << endl; cout << "Float Type Number = " << b << endl; return 0; )
Wynik
Podwójny numer typu = 3,912348239293 Numer typu zmiennoprzecinkowego = 3,912348270416
Jak widać na powyższym przykładzie, określiliśmy dokładność do 13 cyfr.
cout << setprecision(13);
Wartość zmiennoprzecinkowa, którą przypisaliśmy naszym zmiennym, również składa się z 13 cyfr.
Jednak ponieważ float
ma precyzję do zaledwie 7 cyfr, pokazuje wartości śmieci po przekroczeniu precyzji.
Nasza double
zmienna pokazuje poprawną liczbę, ponieważ ma dokładność 15 cyfr, podczas gdy sama liczba składa się z 13 cyfr.
Alternatywnie podczas ich drukowania możemy określić różne dokładności dla różnych zmiennych.
Przykład 3: Różne dokładności dla różnych zmiennych
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Setting precision to 11 for double cout << "Double Type Number = " << setprecision(11) << a << endl; // Setting precision to 7 for float cout << "Float Type Number = " << setprecision(7) << b << endl; return 0; )
Wynik
Podwójny numer typu = 3,9123482393 Liczba zmiennoprzecinkowa = 3,912348
Z powyższego programu widać, że ustawiliśmy dwie różne wartości dokładności dla float
i double
.
W obu przypadkach dokładność jest mniejsza niż rzeczywiste cyfry liczby. Tak więc ostatnia cyfra jest zaokrąglana, a reszta jest obcięta.
Uwaga: Jeśli określimy precyzję większą niż precyzja samego typu danych (7 for float
i 15 for double
), kompilator poda nam wartości śmieciowe po przekroczeniu limitu dokładności, jak widać na float
wyjściu w przykładzie 2 .
Pracuj z liczbami wykładniczymi
Jak wspomniano powyżej, float
a double
może być również używane do reprezentowania numery wykładnicze . Na przykład,
// ex = 325 X (10 25) double ex = 325E25;
C ++ generuje liczby wykładnicze i bardzo duże liczby w formacie zwanym formatem naukowym . Zmienna ex zostanie domyślnie wyprowadzona w tym formacie, ponieważ jest to bardzo duża liczba.
Aby zmusić C ++ do wyświetlania naszych liczb zmiennoprzecinkowych w scientific
formacie niezależnie od rozmiaru liczby, używamy specyfikatora formatu scientific
wewnątrz cout
.
double num = 3.25; // ex = 325 X (10 25) double ex = 325E25; // using scientific format cout << scientific << num; cout << scientific << ex;
Oprócz tego istnieje inny specyfikator formatu, znany jako fixed
, który wyświetla liczby zmiennoprzecinkowe w formacie dziesiętnym.
Jest to podobne do wyświetlania liczb zmiennoprzecinkowych przy użyciu tylko cout
bez setprecision()
, z wyjątkiem faktu, że fixed
wyświetla liczby do 6 miejsc po przecinku.
Z drugiej strony, tylko użycie cout
wyświetla cyfry zgodnie z konkretnym kompilatorem (łącznie 6 cyfr w przypadku kompilatora MinGW , w tym cyfry przed kropką dziesiętną).
Przykład 4: Formaty stałe i naukowe
#include #include using namespace std; int main() ( // Creating a decimal double type variable double a = 3.912348239293; // Creating an exponential double type variable double ex1 = 325e+2; // Creating a float type variable float b = 3.912348239293f; // Creating an exponential float type variable float ex2 = 325e+2f; // Displaying output with fixed cout << "Displaying Output With fixed:" << endl; cout << "Double Type Number 1 = " << fixed << a << endl; cout << "Double Type Number 2 = " << fixed << ex1 << endl; cout << "Float Type Number 1 = " << fixed << b << endl; cout << "Float Type Number 2 = " << fixed << ex2 << endl; // Displaying output with scientific cout << "Displaying Output With scientific:" << endl; cout << "Double Type Number 1 = " << scientific << a << endl; cout << "Double Type Number 2 = " << scientific << ex1 << endl; cout << "Float Type Number 1 = " << scientific << b << endl; cout << "Float Type Number 2 = " << scientific << ex2 << endl; return 0; )
Wynik
Displaying Output With fixed: Double Type Number 1 = 3.912348 Double Type Number 2 = 32500.000000 Float Type Number 1 = 3.912348 Float Type Number 2 = 32500.000000 Displaying Output With scientific: Double Type Number 1 = 3.912348e+000 Double Type Number 2 = 3.250000e+004 Float Type Number 1 = 3.912348e+000 Float Type Number 2 = 3.250000e+004
long double
Apart from float
and double
, there is another data type that can store floating-point numbers. This is known as long double
.
It usually occupies a space of 12 bytes (depends on the computer system in use), and its precision is at least the same as double
, though most of the time, it is greater than that of double
.
long double
values should end with L
. For example,
// declaring a long double variable long double num_ldb = 2.569L;
Uwaga: zmiennoprzecinkowe typy danych obsługiwane przez C ++ to float
, double
i long double
. Nie ma long float
.