nr
To wystarczy dla obu a
lub b
być NaN
dla każdego a < b
, a == b
i a > b
się fałszywe.
Jeśli oba a
i b
są non-NaN następnie dokładnie jeden a < b
, a == b
lub a > b
musi być prawdą.
W uzupełnieniu tego answer informuje, jak można dostać się wartość NaN w języku C++ (istnieje kilka wartości NaN, że można odróżnić poprzez kontrolę ich reprezentacji; wszystkie one są różne od siebie, ponieważ NaN nigdy nie jest równy do wszystkiego,) i jak możesz sprawdzić, czy wartość jest NaN (test idiomatyczny, aby sprawdzić, czy zmienna x
jest NaN to x != x
, a faktycznie std::isnan()
jest często zaimplementowana w ten sposób, ale niektórzy programiści, którzy będą musieli przeczytać twój kod może być przez to mylony).
A następnie, jeśli a
i b
są wynikami poprzednich obliczeń, pojawia się problem nadmiernej precyzji. Zapoznaj się z tym article w celu omówienia w C. Standard C99 rozwiązał problem, określając reguły, gdzie nadmiar precyzji mógł i nie mógł wystąpić, ale pomimo C++ mniej lub bardziej dziedziczącego te reguły przez odroczenie do standardu C dla definicji FLT_EVAL_METHOD
w cfloat
, w praktyce kompilatory C bardziej poważnie podchodzą do reguł niż kompilatory C++. Na przykład GCC implementuje reguły dla C podczas kompilacji z -std=c99
iw tym kontekście możesz polegać na własności do trzymania, ale od tego pisania GCC nie implementuje tych reguł, gdy jest używany jako kompilator C++.
Nie, jeśli twój float jest NaN. –
Prawdopodobnie chcesz zmodyfikować to do "wartości pływających innych niż NaN", aby wykluczyć przypadek narożny? – smci
Nie, ** co najwyżej jedna ** z nich jest gwarantowana. –