2017-02-01 66 views
49

W języku C++, czy mam gwarancję, że dla dowolnego danego float a i float b, jeden i tylko jeden z a < b, a == b i a > b jest prawdziwy?W C++, jest dokładnie jeden z <, == and > gwarantowane, że jest prawdziwe na pływających?

Jeśli to różni się między kompilatorami i platformami, interesuje mnie Visual C++ na x86.

+28

Nie, jeśli twój float jest NaN. –

+1

Prawdopodobnie chcesz zmodyfikować to do "wartości pływających innych niż NaN", aby wykluczyć przypadek narożny? – smci

+2

Nie, ** co najwyżej jedna ** z nich jest gwarantowana. –

Odpowiedz

75

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++.

+0

Czy coś takiego jak "0.0/0.0" również nie dostanie __a__ NaN? –

+0

@JeppeStigNielsen tak, to sposób na zapisanie bez polegania na nagłówku. –

+6

@JeppeStigNielsen: W zależności od ustawień FPU, które mogą generować wyjątek FPU zamiast NaN. –

Powiązane problemy