4.3 Typy zmiennopozycyjne

Standardowe typy zmiennopozycyjne (zmiennoprzecinkowe) to float, double i long double. Typy zmiennopozycyjne odpowiadają w przybliżeniu matematycznemu pojęciu liczb rzeczywistych (z częścią całkowitą i ułamkową).

Dane typu float zajmują zwykle 4 bajty, dane typu double 8 bajtów, jak to widzieliśmy w programie dlugosci.cpp. Reprezentacja nie jest przez standard języka określona (tak jak jest określona w specyfikacji języka Java), ale we wszystkich współczesnych implementacjach C/C++ jest ona, jak w Javie, zgodna z powszechnie akceptowanym standardem IEEE 754 (IEEE 854 dla typu long double). Do wymienionych dwóch typów dochodzi w C/C++ nieznany w Javie typ long double: dane tego typu zajmują zwykle 12 lub 16 bajtów, ale w praktyce są używane bardzo rzadko. Rzadko zresztą są również używane zmienne typu float. Operacje arytmetyczne na zmiennych tego typu są i tak wykonywane po ich konwersji do typu double, więc ich stosowanie w zasadzie nie daje żadnych korzyści, a może wydłużyć czas wykonania i pogorszyć dokładność obliczeń.

Literały wartości typów zmiennopozycyjnych mają standardową, wspólną dla większości języków programowania postać: można używać zapisu z kropką dziesiętną lub notacji naukowej z literą e lub, równoważnie, E, pomiędzy tzw. mantysą a wykładnikiem potęgi dziesięciu, przez którą mantysa ma być pomnożona (kropka w mantysie nie jest konieczna). Wykładnik musi być całkowity; może być poprzedzony znakiem plus lub minus. Domyślnie literał liczbowy zmiennopozycyjny (a więc z kropką lub z częścią potęgową po literze e) jest traktowany jako literał wartości typu double. Jeśli, co zdarza się rzadko, chcemy wymusić traktowanie literału jako litarału wartości typu float lub long double, opatrujemy go odpowiednio literą F lub L:

       float k = 1.23F, m = .1F, n = 3.F;
       double x = 1.2, y = 50., z = 5e-3, v = 0.1e2;
       long double u = 1.23L, v = 30.4e-20L;
W powyższym przykładzie z wynosi 5⋅10-3 = 0.005v ma wartość 0.1⋅102 = 10

T.R. Werner, 25 lutego 2017; 22:31