Атрибут smallest_normal класса finfo
Атрибут smallest_normal класса finfo возвращает минимальное нормализованное положительное число с плавающей точкой для указанного типа данных. Атрибут доступен только для чтения. Нормализованные числа имеют полную точность, в отличие от денормализованных. Значение зависит от количества бит, выделенных для экспоненты и мантиссы.
Синтаксис
np.finfo(dtype).smallest_normal
Пример
Получим минимальное нормализованное число для типа float32:
import numpy as np
min_norm = np.finfo(np.float32).smallest_normal
print("smallest_normal for float32:", min_norm)
Результат выполнения кода:
smallest_normal for float32: 1.1754943508222875e-38
Пример
Сравним smallest_normal и tiny для float32:
import numpy as np
info = np.finfo(np.float32)
print("smallest_normal:", info.smallest_normal)
print("tiny:", info.tiny)
Результат выполнения кода:
smallest_normal: 1.1754943508222875e-38
tiny: 1.1754943508222875e-38
Пример
Сравним smallest_normal для разных типов с плавающей точкой:
import numpy as np
types = [np.float16, np.float32, np.float64]
print("smallest_normal values:")
for t in types:
print(f"{t.__name__}: {np.finfo(t).smallest_normal}")
Результат выполнения кода:
smallest_normal values:
float16: 6.103515625e-05
float32: 1.1754943508222875e-38
float64: 2.2250738585072014e-308
Пример
Использование smallest_normal для проверки на денормализованные числа:
import numpy as np
dtype = np.float32
info = np.finfo(dtype)
values = np.array([1e-40, info.smallest_normal, 1.0], dtype=dtype)
for val in values:
if 0 < val < info.smallest_normal:
print(f"{val} is denormalized")
else:
print(f"{val} is normalized or zero")
Результат выполнения кода:
1e-40 is denormalized
1.1754943508222875e-38 is normalized or zero
1.0 is normalized or zero