Атрибут nexp
Атрибут nexp класса finfo возвращает количество бит, используемых для хранения экспоненты в представлении чисел с плавающей точкой. Вместе с количеством бит мантиссы (доступным через атрибут nmant) это определяет точность и диапазон чисел, которые может представлять данный тип. Для стандартного типа float32 (IEEE 754 single precision) экспонента занимает 8 бит, для float64 (double precision) - 11 бит. Это значение необходимо для понимания динамического диапазона типа данных.
Синтаксис
finfo.nexp
Атрибут доступен только для чтения и возвращает целое число int.
Пример для float32 и float64
Получим количество бит в экспоненте для разных типов:
import numpy as np
f32 = np.finfo(np.float32)
f64 = np.finfo(np.float64)
print("float32:")
print(" nexp:", f32.nexp)
print(" nmant:", f32.nmant)
print(" bits:", f32.bits)
print()
print("float64:")
print(" nexp:", f64.nexp)
print(" nmant:", f64.nmant)
print(" bits:", f64.bits)
Результат выполнения кода:
float32:
nexp: 8
nmant: 23
bits: 32
float64:
nexp: 11
nmant: 52
bits: 64
У float32 экспонента занимает 8 бит, у float64 - 11 бит.
Пример с вычислением диапазона
Количество бит в экспоненте определяет максимальное значение, которое можно представить. Проверим связь между nexp и максимальным значением:
import numpy as np
f = np.finfo(np.float32)
# Максимальное значение примерно равно (2 - 2^(-nmant)) * 2^(2^(nexp-1) - 1)
print("float32 nexp:", f.nexp)
print("float32 max:", f.max)
print("Количество бит экспоненты для float32:", f.nexp)
Результат выполнения кода:
float32 nexp: 8
float32 max: 3.4028234663852886e+38
Количество бит экспоненты для float32: 8
Данный диапазон достигается благодаря 8 битам экспоненты.
Пример сравнения типов
Сравним характеристики различных типов с плавающей точкой:
import numpy as np
types = [np.float16, np.float32, np.float64]
print("Тип | nexp | nmant | bits")
print("------|------|-------|-----")
for dt in types:
f = np.finfo(dt)
print(f"{dt.__name__:5} | {f.nexp:4} | {f.nmant:5} | {f.bits:4}")
Результат выполнения кода:
Тип | nexp | nmant | bits
------|------|-------|-----
float16 | 5 | 10 | 16
float32 | 8 | 23 | 32
float64 | 11 | 52 | 64
С увеличением разрядности растет как количество бит в экспоненте, так и в мантиссе.
Пример с расчетом смещения экспоненты
Зная nexp, можно вычислить смещение (bias) экспоненты для данного типа:
import numpy as np
f = np.finfo(np.float32)
bias = 2**(f.nexp - 1) - 1
print(f"float32: nexp = {f.nexp}")
print(f"Смещение (bias): {bias}")
print(f"Максимальная экспонента: {bias + 1}")
print(f"Минимальная экспонента: {1 - bias}")
Результат выполнения кода:
float32: nexp = 8
Смещение (bias): 127
Максимальная экспонента: 128
Минимальная экспонента: -126
Эти значения соответствуют стандарту IEEE 754 для типа single precision.
Смотрите также
-
атрибут
nmant,
который возвращает количество бит в мантиссе -
атрибут
bits,
который возвращает общее количество бит в типе данных -
класс
finfo,
который предоставляет информацию о типах с плавающей точкой -
атрибут
max,
который возвращает максимальное представимое число