Как найти предел представимых значений для вещественного типа данных в Python?
Написал алгоритм для поиска пределов представимых значений для вещественного типа данных на Python
def max_limit(max):
step = 1
check = 0
check2 = 1
while check != check2:
max = check
check = check2
check2 = check2 + step
step *= 1.3
while max + step != max:
if max + step == check:
step *= 0.5
else:
max += step
return max
def min_limit(min):
step = 1
while min - step != min:
if min - step <= 0:
step *= 0.5
else:
min -= step
return min
При выводе максимума выводит значение 1.7976931348623157e+308, что есть правда (сверялся с функцией sys.float_info), но минимум получается 5e-324 хотя должен быть 2.2250738585072014e-308. Как исправить код для поиска минимума или тут нужен другой подход?
Ответы (1 шт):
Числа с плавающей точкой бывают нормальными и ненормальными.
Нормализованное представление числа - это такое, у которого мантисса больше или равна 1. Денормализованное -- это представление числа с мантиссой меньше 1.
Например 9e0 - это нормализованное представление числа 9, а 0.09e2 - денормализованное.
Наименьшее число с нормализованным представлением имеет двоичное представление
0 00000000001 0000000000000000000000000000000000000000000000000000. Именно оно возвращается в sys.float_info как 2.2250738585072014e-308
Но на интеловской платформе есть специальное представление для самых малых чисел с мантиссой меньше 1. У этих чисел экспонента равна 00000000000 и в мантиссе нет неявной единицы.
Соответственно, самое близкое к нулю число в 64-х битном представлении - это 5e-324, которое соответствует денормализованному 2^-52 * 10^-308.
Это число не указывается в sys.float_info, так как не все процессоры поддерживают субнормальные числа.