Как найти предел представимых значений для вещественного типа данных в 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 шт):

Автор решения: Pak Uula

Числа с плавающей точкой бывают нормальными и ненормальными.

Нормализованное представление числа - это такое, у которого мантисса больше или равна 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, так как не все процессоры поддерживают субнормальные числа.

→ Ссылка