Каково первое целое число, которое плавающий IEEE 754 не может точно представлять?
Для ясности, если я использую язык, который реализует поплавки IEE 754, и я заявляю:
float f0 = 0.f;
float f1 = 1.f;
... и затем распечатайте их обратно, я получу 0.0000 и 1.0000 - точно.
Но IEEE 754 не способен отображать все числа вдоль реальной строки. Близко к нулю "пробелы" малы; когда вы уходите дальше, пробелы становятся больше.
Итак, мой вопрос: для float IEEE 754, который является первым (самым близким к нулю) целым числом, которое не может быть точно представлено? Я действительно очень обеспокоен 32-битными поплавками для теперь, хотя мне будет интересно услышать ответ на 64-битный, если кто-то его даст!
Я думал, что это будет так же просто, как вычисление 2 bits_of_mantissa и добавление 1, где bits_of_mantissa - это количество бит, которое предоставляет стандарт. Я сделал это для 32-битных поплавков на моей машине (MSVС++, Win64), и это выглядело прекрасно.
Ответы
Ответ 1
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
Ответ 2
Наибольшее значение, представляемое целочисленным числом n, равно 2 n -1. Как отмечено выше, a float
имеет 24 бита точности в значении, которое, казалось бы, означает, что 2 24 не подходит.
Однако.
Полномочия 2 в пределах показателя экспоненты в точности представлены как 1,0 & times; 2 n поэтому 2 24 может поместиться и, следовательно, первая непредставимая целое число для float
равно 2 24 +1. Как указано выше. Опять же.