Это вопрос с подвохом.
Форматы с плавающей точкой определяют некоторые специальные значения. Считаете ли вы их различными, зависит от вашей точки зрения. Следующее предназначено для двойной точности (binary64):
- Существует два представления 0: со знаковым битом 0 или 1, а показатель степени и мантисса равны нулю. Значения различаются тем, что 1 / + 0 = бесконечность и 1 / -0 = -инфинитность. Но они сравниваются равными.
- Есть 2 бесконечности, где первые 12 бит равны 0x7ff или 0xfff, а мантисса равна нулю. Это не конечные действительные числа, а значения.
- Существует целый ряд значений Not-A-Number (NaN), имеющих биты знака + экспоненты 0x7ff (сигнальный NaN) или 0xfff ("тихий" NaN) и ненулевую мантиссу. Опять же, это не действительные числа, а различимые значения.
Итак, подведем итог:
- Общее количество различимых значений (действительных чисел или иным образом) составляет 2 ^ 64.
- Число различных действительных чисел, исключая бесконечности и считая ноль только один раз, составляет
2*(2^11-1)*2^52-1 = 18,437,736,874,454,810,623
.
Для двоичного16 число различных действительных чисел составляет 2*(2^5-1)*2^10-1 = 63,487
. Для двоичного 32 это 2*(2^8-1)*2^23-1=4,278,190,079
. Для двоичного кода 128 это 2*(2^15-1)*2^112-1
или около 3.4*10^38
.