Dlaczego w danym programie otrzymałem różne wyniki dla każdego z nich printf
?
#include <stdio.h>
int main()
{
float c = 4.4e10;
printf("%f\n", c);
printf("%f\n", 4.4e10);
return 0;
}
I pokazuje następujące dane wyjściowe:
44000002048.000000
44000000000.000000
4.4e10
jest todouble
stała, która jest przekształcanafloat
podczas inicjalizacji,c
ale zachowywana jakodouble
przekazanaprintf
. Jednakże, to polubisz też wiedzieć, że dodanief
przyrostka sprawia mufloat
stałej: Druk4.4e10f
pokaże tę samą wartość, która wynika z inicjalizacjic
do4.4e10f
. Odróżnianiefloat
stałych oddouble
stałych może być ważne przy wykonywaniu wysokiej jakości pracy z arytmetyką zmiennoprzecinkową.double
nafloat
ma miejsce w języku C? A może chcesz wiedzieć, jakie wartości wynikają z konwersji, czyli jakie skutki ma konwersja? Albo coś innego?C
użyliśmyprintf("%f",x)
dlafloat
iprintf("%lf",x)
dladouble
. Kiedy coś się zmieniło? A jak by to wyraźnie wydrukować (singiel)float
-printf("%hf",x)
??%lf
w printf to to samo, co%f
.float
Argument A w zmiennej jest konwertowany nadouble
kompilator, podobnie jak ashort
jest konwertowany na anint
.Odpowiedzi:
A
float
jest typem, który zawiera 32-bitową liczbę zmiennoprzecinkową, podczas gdy stała4.4e10
reprezentuje adouble
, która zawiera 64-bitową liczbę zmiennoprzecinkową (tj. Liczba zmiennoprzecinkowa podwójnej precyzji)Po przypisaniu
4.4e10
doc
wartości4.4e10
nie można dokładnie przedstawić (błąd zaokrąglenia w parametrze zwanym mantysą), a najbliższa możliwa wartość (44000002048) zostaje zapisana. Gdy jest przekazywanyprintf
, jest promowany z powrotemdouble
, łącznie z błędem zaokrąglenia.W drugim przypadku wartość jest
double
cały czas, bez zwężania i poszerzania, i zdarza się, że adouble
może dokładnie reprezentować wartość.Jeśli jest to niepożądane zachowanie, możesz zadeklarować
c
jakodouble
na nieco większą precyzję (ale pamiętaj, że będziesz nadal hit granice precyzji ostatecznie).źródło
W rzeczywistości drukujesz tutaj wartości dwóch różnych typów.
W pierwszym przypadku przypisujesz wartość zmiennej typu
float
. Precyzja afloat
wynosi około 6 lub 7 cyfr dziesiętnych, więc jeśli nie da się dokładnie przedstawić wartości, zobaczysz najbliższą wartość, którą może reprezentować ten typ.W drugim przypadku podajesz stałą,
4.4e10
która ma typdouble
. Ten typ ma około 16 cyfr dokładności dziesiętnej, a wartość mieści się w tym zakresie, więc drukowana jest dokładna wartość.źródło