… границы 32-битного числа со знаком…
Представляемые числа в float
находятся в диапазоне от −∞ до + ∞, поэтому все конечные числа находятся в диапазоне , Но я предполагаю, что вы хотите рассмотреть конечный диапазон типа float
, а не полный диапазон.
_23bit_max_bin = '1' * 23 # '11111111111111111111111'
_23bit_max_dec = int(_23bit_max_bin, 2) # 8388607
Это дает вам максимальное значение поля значимости и в кодировке float
, интерпретируемое как двоичное целое число. Это не максимальное значение представленного значения.
Предполагая, что поле экспоненты не является ни всеми нулями, ни всеми, представленное значение представляет собой число, двоичное число которого равно «1», за которым следует «.» следуют биты значимого поля. Таким образом, максимальное значение равно 1.11111111111111111111111 2 = 2 1 -2 −23 .
exponent_bin = '1' * 8 # '11111111'
Это дает вам максимальное значение поле экспоненты. Однако максимальное значение поля экспоненты используется для кодирования бесконечностей и NaN, а не конечных чисел. Максимальное значение поля экспоненты, используемого для конечных чисел, составляет 11111110 2 (254 10 ). Кроме того, представленный показатель представляет собой значение поля показателя (интерпретируемого как двоичное целое число) минус 127. Таким образом, максимальный показатель составляет 254−127 = 127.
_dec_tuple = (0, _coeffient_tuple, _exponent_dec) # (1, (8, 3, 8, 8, 6, 0, 6), 254)
, который использует 254 в качестве показателя 10 Показатель степени в формате float
представляет собой показатель степени 2.
Максимальное конечное значение, представляемое в float
, представляет собой максимальное значение, умноженное на 2 на степень максимального показателя степени, поэтому оно равно (2 1 −2 −23 ) • 2 127 = 2 128 - 2 104 = 340282346638528859811704183484516925440. Давайте назовем это число M .
Тем не менее, при определении, находится ли десятичная цифра в границах, вы должны решить, хотите ли вы подумать:
- число в - M до + M включительно или
- число находится в диапазоне, где обычное округление при преобразовании в
float
даст значение в - M до + M включительно ( т.е. , это д oes не округляется до бесконечности).
В последнем случае, в режиме округления до ближайшего, желаемое ограничение составляет 2 128 - 2 104 + 2 103 = 2 128 - 2 103 = 340282356779733661637539395458142568448, эксклюзив. Этот «полушаг», 2 103 , к тому месту, где будет следующий представимый номер, если диапазон экспонент будет продолжать двигаться, - это то, где метод округления к ближайшему изменяется между округлением в меньшую сторону и округлением в большую сторону. В случае, когда в ie именно в этой точке, оно округляется до числа с четным значащим и битом, который будет восходящим. Таким образом, вы хотите исключить его, следовательно, интервал является исключительным, а не включающим.
Как правило, если точность равна p (поле значимостей составляет p −1 бит ) и поле экспоненты имеет w бит, смещение экспоненты составляет 2 w -1 -1, максимальный показатель такой же и наибольшее представимое конечное значение является (2-2 1− p ) • 2 2 w −1 −1 = (1 −2 - p ) • 2 2 w -1 .