Какое первое целое число, которое IEEE 754 не может точно представить? - PullRequest
144 голосов
/ 25 сентября 2010

Для ясности, если я использую язык, который реализует плавающие объекты IEE 754, и я объявляю:

float f0 = 0.f;
float f1 = 1.f;

... а затем распечатайте их обратно, я получу 0,0000 и 1,0000 - точно.

Но IEEE 754 не способен представлять все числа вдоль реальной линии. Близко к нулю, «пробелы» малы; по мере того, как вы уходите дальше, промежутки увеличиваются.

Итак, мой вопрос: для числа с плавающей запятой IEEE 754, которое является первым (ближайшим к нулю) целым числом, которое не может быть точно представлено? На данный момент меня интересуют только 32-разрядные числа с плавающей точкой , хотя мне будет интересно услышать ответ для 64-битного, если кто-то его даст!

Я подумал, что это будет так же просто, как вычислить 2 bits_of_mantissa и сложить 1, где bits_of_mantissa - это количество битов, которое предоставляет стандарт. Я сделал это для 32-разрядных операций с плавающей запятой на моей машине (MSVC ++, Win64), и все выглядело нормально.

Ответы [ 2 ]

178 голосов
/ 25 сентября 2010

2 биты мантиссы + 1 + 1

+1 в показателе степени (биты мантиссы + 1) объясняется тем, что, если мантисса содержит abcdef..., то число, которое она представляет, фактически 1.abcdef... × 2^e, что обеспечивает дополнительный неявный бит точности.

Для float это 16 777 217 (2 24 + 1).
Для double это 9 007 199 254 740 993 (2 53 + 1).

>>> 9007199254740993.0
9007199254740992
35 голосов
/ 12 апреля 2014

Наибольшее значение, представляемое целым битом n , равно 2 n -1.Как отмечалось выше, float имеет 24 бит точности в значении, и это может означать, что 2 24 не подходит.

Однако .

Степени 2 в пределах показателя степени точно представлены как 1,0 × 2 n , поэтому 2 24 может подходит и, следовательно, первое непредставленное целое число для float равно 2 24 + 1.Как указано выше.Опять же.

...