Какое первое целое число, которое IEEE 754 не может точно представить?

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

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

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

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

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

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

 Kyle Strand24 дек. 2016 г., 13:00
@PascalCuoq Полностью не согласен, даже после прочтения вашей ссылки (которая, похоже, ничего не говорит о контекстах, в которых «однако» подходит, а «как» - нет).
 Pascal Cuoq14 дек. 2014 г., 14:07
@ ks1322 Ваше редактирование делает предложение неграмотным. «Однако сколько» не эквивалентно «сколько» и правильно используется в исходном предложении (тогда как «сколько» не подходит). Увидетьenglish-test.net/forum/ftopic9565.html или много других результатов Google, если вы хотите увидеть больше примеров такого рода фраз.
 Pascal Cuoq27 дек. 2016 г., 00:40
@KyleStrand вернулся ^ 2. Я не знаю, почему один показался мне более правильным, чем другой в то время. Теперь они оба кажутся неловкими по сравнению с «… это количество бит…»
 Kyle Strand27 дек. 2016 г., 07:27
@PascalCuoq Спасибо за дальнейшее рассмотрение вопроса и внесение изменений! Я согласен, «число» было бы превосходной формулировкой.
 msw25 сент. 2010 г., 14:46
Зачем вы добавили один, если вы хотели не представительный номер? А какой номер вы использовали или получили? И это домашнее задание? И в заголовке вашего вопроса написано "integer", а в вашем вопросе "float".
 Floomi25 сент. 2010 г., 14:56
Потому что я рассчитывал, что при максимальном увеличении мантиссы я получу наибольшее представимое число. 2 ^ 22. Нет, это вопрос любопытства. Я всегда чувствовал себя виноватым, помещая ints в float, даже когда я знаю, что рассматриваемый int всегда будет очень маленьким. Я хочу знать, каков верхний предел. Насколько я могу судить, заголовок и вопрос одинаковы, просто сформулированы по-разному.
 FrankH.31 июл. 2013 г., 01:11

Ответы на вопрос(2)

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

тем не мение.

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

 chappjc24 авг. 2015 г., 20:03
Это ясно объяснило «дополнительный неявный бит точности» другой части. Благодарю.
Решение Вопроса

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

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

ЗаfloatЭто 16 777 17 (4 +1)
Заdoubleэто 9 007 199 54 740 993 (53 +1)

>>> 900719954740993.0
90071995474099
 AlanSTACK04 авг. 2018 г., 20:22
Так-16,777,217 а также-9,007,199,254,740,993? Или они 1 или что-то в этом роде.
 kennytm02 авг. 2018 г., 07:49
@AlanSTACK Отрицательное число с наибольшей величиной - это просто отрицание первой позиции.
 kennytm15 окт. 2014 г., 10:05
@sodiumnitrate Проверьте название вопроса. 16777217 - первое целое числонеспособный быть представленным точно.
 ylun.ca10 нояб. 2015 г., 03:08
Извините, а также, как бы мы нашли, скажем, второе наименьшее целое число?
 AlanSTACK02 авг. 2018 г., 07:16
Как насчет самых больших отрицательных чисел дляfloat а такжеdouble?
 Martin Ba21 нояб. 2017 г., 13:17
Связанные с:digits10
 kennytm16 окт. 2014 г., 09:53
Следующее целое число действительно 16777218, потому что теперь 2 становится последней значащей двоичной цифрой.
 sodiumnitrate14 окт. 2014 г., 20:56
Я объявилfloat и установите его равным 16 777 217. Но когда я напечатал это с помощьюcout это привело к 16 777 216. я используюC++, Почему я не могу получить 16 777 217?
 Floomi25 сент. 2010 г., 16:24
Фантастика, большое спасибо. Работает, как и ожидалось, на моей машине - я знал, что делаю глупости с математикой!
 ylun.ca09 нояб. 2015 г., 00:36
Как бы вы поступили, если бы число было четным?
 sodiumnitrate15 окт. 2014 г., 17:54
Хорошо спасибо. Я запутался, извините за это. У меня есть еще один вопрос: после 16777216, не должно ли следующее целое число, которое представимо, быть 2 * 16777216? Когда я запускаю аналогичную программу, я получаю 16777218, добавляя 2 к 16777126.
 dashesy15 нояб. 2017 г., 23:58
@HenrySchreiner, вы должны представить, что в качестве ответа это хороший и краткий ответ для C ++ и C.
 Zack Morris09 авг. 2019 г., 01:20
Вы можете использовать это, чтобы исследовать битовые представления с плавающей запятой и найти минимальные / максимальные целочисленные значения:h-schmidt.net/FloatConverter/IEEE754.html Вот еще один для 16, 32, 64 и 128-битной плавающей запятой:weitz.de/ieee
 Henry Schreiner21 сент. 2017 г., 21:00
В C ++ это(1 << std::numeric_limits<float>::digits) + 1и в C,(1 << FLT_MANT_DIG) + 1, Первое приятно, потому что это может быть частью шаблона. Не добавляйте +1, если вы просто хотите наибольшее представимое целое число.

Ваш ответ на вопрос