2012-10-10 10 views
9

Opis typu float w C wspomina, że ​​liczba cyfr znaczących to 6. JednakLiczba cyfr znaczących dla typu zmiennoprzecinkowego

float f = 12345.6; 

a następnie drukować je za pomocą printf() nie drukuje 12345.6, drukuje 12345.599609. Co oznacza więc "6 cyfr znaczących" (lub "15 w przypadku double") dla typu zmiennoprzecinkowego?

+8

Należy pamiętać, że typy zmiennoprzecinkowe nie są zapisywane w bazie 10, więc liczba cyfr znaczących * dziesiętnych * jest koniecznie przybliżeniem. –

+2

W rzeczywistości jest 8 bitów dla exp i 23 bitów dla frac. – halfelf

Odpowiedz

10

Zgodnie z standard, nie wszystkie liczby dziesiętne mogą być przechowywane dokładnie w pamięci. W zależności od rozmiaru reprezentacji błąd może osiągnąć określone maksimum. Dla float jest to 0.0001% (6 cyfr znaczących = 10^-6 = 10^-4 %).

W twoim przypadku błąd jest o (12345.6 - 12345.599609)/12345.6 = 3.16e-08 znacznie niższy niż maksymalny błąd dla pływaków.

16

6 cyfr znaczących oznacza, że ​​maksymalny błąd wynosi około +/- 0,0001%. Pojedyncza wartość zmiennoprzecinkowa ma około 7,2 cyfr precyzji (source). Oznacza to, że błąd wynosi około +/- 12345.6/10^7 = 0.0. Który jest rzędu twojego błędu (0,000391).

0

Problem polega na tym, że nie można zapewnić, że liczba może być przechowywana w float. Tę liczbę należy reprezentować mantysą, podstawą i wykładnikiem, jak wyjaśnia IEEE 754. Numer printf(...) pokazuje, że jest to prawdziwa liczba zmiennoprzecinkowa, która została zapisana. Nie można zapewnić liczby znaczących cyfr w liczbie zmiennoprzecinkowej.

7

To, co widzisz, nie jest tak naprawdę problemem ze znaczącymi cyframi, ale faktem, że liczby na komputerze są przechowywane w systemie binarnym i nie ma skończonej reprezentacji binarnej dla 3/5 (= 0,6). 3/5 w formacie binarnym wygląda jak 0.100110011001 ..., a wzorzec "1001" powtarza się na zawsze. Ta sekwencja odpowiada 0,599999 ... powtórzeniu. W rzeczywistości dochodzisz do trzech miejsc po przecinku na prawo od kropki dziesiętnej przed błędem związanym z precyzyjnymi kopnięciami.

Jest to podobne do tego, jak nie ma skończonej reprezentacji 1/4 podstawy-10; mamy 0.3333 powtarzających się na zawsze.

Powiązane problemy