Какое первое целое число, которое 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), и это казалось прекрасным.
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