Która jest pierwszą liczbą całkowitą, której float IEEE 754 nie jest w stanie dokładnie przedstawić?
Dla jasności, Jeśli używam języka implementującego IEEE 754 i deklaruję:
float f0 = 0.f;
float f1 = 1.f;
...a potem wydrukować je z powrotem, dostanę 0.0000 i 1.0000-dokładnie.
Ale IEEE 754 nie jest w stanie przedstawić wszystkich liczb wzdłuż rzeczywistej linii. Bliskie zeru "luki" są małe; w miarę oddalania się, luki stają się większe.Moje pytanie brzmi: dla zmiennoprzecinkowego IEEE 754, który jest pierwszą (najbliższą zero) liczbą całkowitą, która nie może być dokładnie reprezentowany? na razie interesuje mnie tylko 32-bitowe Floaty, chociaż chętnie wysłucham odpowiedzi na 64-bitowe, jeśli ktoś ją poda!
Myślałem, że będzie to tak proste, jak obliczenie 2bits_of_mantissa i dodanie 1, Gdzie bits_of_mantissa jest liczbą bitów standardowych. Zrobiłem to dla 32-bitowych pływaków na moim komputerze (MSVC++, Win64) i wydawało się to jednak w porządku.
2 answers
2mantissa bits + 1 + 1
+1 w wykładniku (bity mantysy + 1) wynika z tego, że jeśli mantysa zawiera abcdef...
liczba, którą reprezentuje, jest w rzeczywistości 1.abcdef... × 2^e
, zapewniając dodatkowy, niejawny bit precyzji.
Dla float
, jest 16,777,217 (224 + 1).
Dla double
, jest 9,007,199,254,740,993 (253 + 1).
>>> 9007199254740993.0
9007199254740992
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 23:43:10
Największą wartością reprezentowaną przez N bitową liczbę całkowitą jest 2n-1. Jak wspomniano powyżej, float
mA 24 bity precyzji w significand, co wydaje się sugerować, że 224 nie pasuje.
jednakże .
Potęgi 2 w przedziale wykładnika są dokładnie reprezentowalne jako 1.0×2n, więc 224można dopasować i w konsekwencji pierwszą niereprezentowalną liczbą całkowitą dla float
jest 224+1. Jak zaznaczono powyżej. Jeszcze raz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 13:51:02