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



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



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


...а потом распечатайте их обратно, я получу 0.0000 и 1.0000 - точно.



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



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



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

553   2  

2 ответов:

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

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

на float, это 16,777,217 (224 + 1).
Ибо double, это 9,007,199,254,740,993 (253 + 1).

>>> 9007199254740993.0
9007199254740992

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

.

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

Comments

    Ничего не найдено.