From 495c8402542277bfbda65d6c314a87e2664b76c4 Mon Sep 17 00:00:00 2001 From: Vadim Nifadev <36514612+nifadyev@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:21:35 +0300 Subject: [PATCH] Translate Nan-reflexivity example --- translations/README-ru.md | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/translations/README-ru.md b/translations/README-ru.md index 638536d..9183b74 100644 --- a/translations/README-ru.md +++ b/translations/README-ru.md @@ -1610,3 +1610,78 @@ def some_func(x): ``` --- + + +### ▶ Nan-рефлексивность * + + + +1\. + +```py +a = float('inf') +b = float('nan') +c = float('-iNf') # Эти строки не чувствительны к регистру +d = float('nan') +``` + +**Результат:** + +```py +>>> a +inf +>>> b +nan +>>> c +-inf +>>> float('some_other_string') +ValueError: could not convert string to float: some_other_string +>>> a == -c # inf==inf +True +>>> None == None # None == None +True +>>> b == d # но nan!=nan +False +>>> 50 / a +0.0 +>>> a / a +nan +>>> 23 + b +nan +``` + +2\. + +```py +>>> x = float('nan') +>>> y = x / x +>>> y is y # идендичность сохраняется +True +>>> y == y # сравнение ложно для y +False +>>> [y] == [y] # но сравнение истинно для списка, содержащего y +True +``` + +#### 💡 Объяснение: + +- `'inf'` и `'nan'` - это специальные строки (без учета регистра), которые при явном приведении к типу `float` используются для представления математической "бесконечности" и "не число" соответственно. + +- Согласно стандартам IEEE `NaN != NaN`, но соблюдение этого правила нарушает предположение о рефлексивности элемента коллекции в Python, то есть если `x` является частью коллекции, такой как `list`, реализации, методы сравнения предполагают, что `x == x`. Поэтому при сравнении элементов сначала сравниваются их идентификаторы (так как это быстрее), а значения сравниваются только при несовпадении идентификаторов. Следующий фрагмент сделает вещи более ясными: + + ```py + >>> x = float('nan') + >>> x == x, [x] == [x] + (False, True) + >>> y = float('nan') + >>> y == y, [y] == [y] + (False, True) + >>> x == y, [x] == [y] + (False, False) + ``` + + Поскольку идентификаторы `x` и `y` разные, рассматриваются значения, которые также различаются; следовательно, на этот раз сравнение возвращает `False`. + +- Интересное чтение: [Рефлексивность и другие основы цивилизации](https://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/) + +---