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.

Author: Pascal Cuoq, 2010-09-25

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
 157
Author: kennytm,
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.

 29
Author: thus spake a.k.,
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