1. Nie da się obciąć miejsc dziesiętnych w liczbie zmiennoprzecinkowej, bo te liczby nie są trzymane w postaci rozwinięcia dziesiętnego, tylko dwójkowego. Każdy float reprezentuje liczbę postaci
\(\displaystyle{ (-1)^s \cdot 2^c \cdot \left( 1 + \frac{a_1}{2} + \frac{a_2}{4} + \ldots + \frac{a_{23}}{2^{23}} \right),}\)
gdzie
\(\displaystyle{ s, a_1, \ldots, a_{23} \in \{ 0, 1 \}}\) oraz
\(\displaystyle{ c \in \{ -127, \ldots, 127 \}.}\) (Są jeszcze wartości specjalne, ale mniejsza o to).
Nie można więc dokładnie zapisać liczby
-0.999999
, bo ona nie jest tej postaci (nie jest ułamkiem o mianowniku
\(\displaystyle{ 2^{23}}\)).
2. Nie. Typ
int
pamięta tylko i wyłącznie liczby całkowite, bez ukrytych miejsc po przecinku.
Obliczenia na liczbach zmiennoprzecinkowych są nie do końca dokładne (chyba jest gwarancja, że błąd względny wyniku dodawania, odejmowania, mnożenia i dzielenia jest
\(\displaystyle{ \le 2^{-23}}\)). Najwyraźniej wystąpił taki właśnie drobny (ale nieunikniony) błąd w obliczeniach.
3. Jeśli chcesz liczby zmiennoprzecinkowe wyświetlać z zadaną liczbą miejsc po przecinku, to możesz najpierw wpisać napis do tablicy:
Kod: Zaznacz cały
float a = -1.0;
char c[16];
sprintf( c, "%f", a );
a potem pokombinować z tym napisem zanim wypiszesz go na ekran.