Типы с плавающей точкой (такие как Single и Double) представлены в памяти знаком, мантиссой и показателем степени. Думайте об этом как научная запись:
Sign*Mantissa*Base^Exponent
Они - как вы можете ожидать - используют базу 2. Существуют и другие твики, которые позволяют представлять бесконечность и NaN, а показатель степени смещен (вернется к этому) и сокращенный вариант мантиссы (вернусь к этому тоже) , Ищите стандарт IEEE 754, который охватывает его представление и операции для получения более подробной информации.
Для наших целей мы можем представить его как двоичное число «мантисса» и «показатель степени», который говорит вам, куда поместить десятичный разделитель.
В случае Single у нас есть 1 бит для знака, 8 для показателя степени и 23 для мантиссы.
Теперь дело в том, что мы будем хранить мантиссу из самой значимой цифры. Помните, что все нули слева не имеют значения. И учитывая, что мы работаем в двоичном формате, мы знаем, что самая значимая цифра - 1 ※. Ну, так как мы знаем это, нам не нужно хранить это. Благодаря этому сокращению эффективный диапазон мантиссы составляет 24 бита.
※: Если число, которое мы храним, не равно нулю. Для этого у нас все биты будут установлены на ноль. Однако, если мы попытаемся интерпретировать это в соответствии с описанием, которое я дал, вы бы получили 2 ^ 24 (неявное 1), умноженное на 1 (2 на степень показателя 0). Итак, чтобы исправить это, нулевой показатель степени является особым значением. Существуют также специальные значения для хранения бесконечности и NaN в показателе степени.
В соответствии со смещением экспоненты - помимо исключения специальных значений - наличие его смещения позволяет поместить десятичную точку перед началом мантиссы или после ее конца, без необходимости иметь знак для экспоненты.
Это означает, что для больших чисел тип с плавающей запятой ставит десятичную точку за концом мантиссы.
Помните, что мантисса - это 24-битное число. Он никогда не будет представлять 25-битное число ... у него нет этого дополнительного бита. Таким образом, сингл не может различить 2 ^ 24 и 2 ^ 24 + 1 (это первые 25-битные числа, и они отличаются на последнем бите, который не представлен в сингле).
Таким образом, для целых чисел диапазон сингла составляет от -2 ^ 24 до 2 ^ 24. И попытка добавить 1 к 2 ^ 24 приведет к 2 ^ 24 (потому что, что касается типа, 2 ^ 24 и 2 ^ 24 + 1 - это одно и то же значение). Попробуйте онлайн . Вот почему при преобразовании целого числа в единичное происходит потеря информации. И это также, почему цикл, который использует одинарную или двойную, может на самом деле быть бесконечным циклом без вашего ведома.