Jako pojęcia matematyczne doskonale zdaję sobie sprawę z tego, czym są w rzeczywistości i nan
. Ale naprawdę interesuje mnie to, w jaki sposób są one wdrażane w językach programowania.W jaki sposób są wdrażane systemy Inf i NaN?
W Pythonie mogę używać inf
i nan
w arytmetycznych i warunkowych wyrażeń, takich jak to:
>>> nan = float('nan')
>>> inf = float('inf')
>>> 1 + inf
inf
>>> inf + inf
inf
>>> inf - inf
nan
będzie to prowadzić mi uwierzyć, że Python posiada wewnętrznie specjalnego zarezerwowanego sekwencji bitów dla tych dwóch wielkości matematycznych, i żadna inna liczba nie może przyjąć tych pozycji. Czy moje założenie jest poprawne? Czy możesz mnie oświecić w tym względzie?
Jeśli moje założenie jest poprawne, to można wytłumaczyć w prosty sposób:
>>> inf == inf
True
to jednak nie jest:
>>> nan == nan
False
Oczywiście, w matematyce, to jest prawidłowa odpowiedź. Ale skąd Python wie, że powinien wypluć w tym przypadku False
?
Co więcej, w jaki sposób implementacja Pythona różni się od implementacji java lub C++?
Ponieważ instrukcje maszyny zmiennoprzecinkowej dla porównania zwracają wartość false, aby porównać nan z niczym, w tym z samym sobą – camelccc
Jest to związane ze standardem [IEEE 754] (https://en.wikipedia.org/wiki/IEEE_754). –
Prawie wszystkie języki programowania używają IEEE 754 dla wartości zmiennoprzecinkowych, które precyzyjnie określają, czym są te wartości specjalne, jak są reprezentowane i jak zachowują się w różnych operacjach. –