Каково первое целое число, которое плавающий 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. Как указано выше. Опять же.