Для ясности, если я использую язык, который реализует плавающие объекты 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 биты мантиссы + 1 + 1
+1 в показателе степени (биты мантиссы + 1) объясняется тем, что, если мантисса содержит
abcdef...
число, которое она представляет, фактически1.abcdef... × 2^e
обеспечивает дополнительный неявный бит точности.Следовательно, первое целое число, которое не может быть точно представлено и будет округлено:
For
float
, 16 777 217 (2 24 + 1).За 9
double
007 199 254 740 993 (2 53 + 1).источник
float
и установил его равным 16 777 217. Но когда я распечатал его с помощью,cout
это привело к 16 777 216. Я используюC++
. Почему я не могу получить 16 777 217?(1 << std::numeric_limits<float>::digits) + 1
, и в C,(1 << FLT_MANT_DIG) + 1
. Первый вариант хорош тем, что может быть частью шаблона. Не добавляйте +1, если вы просто хотите наибольшее представимое целое число.Наибольшее значение, представляемое n- битным целым числом, равно 2 n -1. Как отмечалось выше, значение a
float
имеет 24 бита в значении, и это может показаться, что 2 24 не подходят.Однако .
Степени 2 в диапазоне показателя в точности представимы как 1,0 × 2 n , так что 2 24 может соответствовать, и, следовательно, первое непредставимое целое число для
float
равно 2 24 +1. Как указано выше. Очередной раз.источник