Атрибут resolution
Атрибут resolution класса finfo возвращает
приблизительную десятичную точность чисел с плавающей запятой
для данного типа данных. Это значение показывает, насколько
малым может быть изменение числа, чтобы оно все еще было
заметно для компьютера. По сути, это десятичный эквивалент
машинной точности eps.
Атрибут доступен только для типов с плавающей запятой,
таких как float16, float32, float64
и float128. Для целочисленных типов данных использовать
finfo нельзя.
Синтаксис
np.finfo(dtype).resolution
Пример
Давайте получим значение разрешения для типа float64:
import numpy as np
res = np.finfo(np.float64).resolution
print(res)
Результат выполнения кода:
1.0000000000000001e-15
Пример
Давайте сравним разрешение для разных типов данных с плавающей запятой:
import numpy as np
res_16 = np.finfo(np.float16).resolution
res_32 = np.finfo(np.float32).resolution
res_64 = np.finfo(np.float64).resolution
print(res_16)
print(res_32)
print(res_64)
Результат выполнения кода:
0.001
1.0000000000000001e-07
1.0000000000000001e-15
Как видно из примера, чем больше бит используется для представления числа, тем выше его разрешение (точность).
Пример
Давайте посмотрим на практическое применение resolution
при сравнении чисел с плавающей запятой:
import numpy as np
eps = np.finfo(np.float64).eps
res = np.finfo(np.float64).resolution
a = 1.0
b = 1.0 + eps / 2
print("eps:", eps)
print("resolution:", res)
print("a == b:", a == b)
print("abs(a - b) < res:", abs(a - b) < res)
Результат выполнения кода:
eps: 2.220446049250313e-16
resolution: 1.0000000000000001e-15
a == b: False
abs(a - b) < res: True
Значение resolution примерно в 4-5 раз больше
значения eps. Это связано с тем, что resolution
учитывает десятичное округление, а eps - двоичное.
Пример
Давайте используем resolution для проверки близости
двух чисел при работе с массивом:
import numpy as np
rng = np.random.default_rng(0)
arr = rng.random(5)
arr2 = arr + np.finfo(np.float64).resolution / 3
diff = np.abs(arr - arr2)
res = np.finfo(np.float64).resolution
print("Array:", arr)
print("Array2:", arr2)
print("Differences:", diff)
print("All differences < resolution:", np.all(diff < res))
Результат выполнения кода:
Array: [0.63696169 0.26978671 0.04097352 0.01652764 0.81327024]
Array2: [0.63696169 0.26978671 0.04097352 0.01652764 0.81327024]
Differences: [3.33333333e-16 3.33333333e-16 3.33333333e-16
3.33333333e-16 3.33333333e-16]
All differences < resolution: True
Смотрите также
-
класс
finfo,
который предоставляет информацию о типах с плавающей запятой -
атрибут
eps,
который возвращает машинную точность для типа данных -
атрибут
precision,
который возвращает приблизительное количество десятичных цифр точности -
атрибут
tiny,
который возвращает минимальное положительное нормализованное число