2016-08-23 28 views
7

Przy obliczaniu wartości bezwzględnej liczby całkowitej lub wartości zmiennoprzecinkowej, czy istnieje zaleta korzystania abs z stdlib.h lub Fab z math.h porównaniu użyciu operatora warunkowybezwzględna obliczanie wartości

#define ABS(x) (((x) >= 0)? (x): -(x)) 
+16

Wypróbuj 'abs (x ++)', zobacz dokąd zabierze Cię makro. – EOF

+3

Tak, funkcje 'abs' i' fabs' są * standardowymi * funkcjami. I są to * funkcje *, a nie makra. –

+0

Kod może być bardziej czytelny, jeśli użyte zostanie 'abs' lub' fabs'. – Codor

Odpowiedz

6

kod powinien korzystać abs() z int (lub mniej), fabs() pomocą podwójnej z float, labs(x) z long itp @Joachim Pileborg

  1. Zaleta: nie makro. Makro ABS() ocenia argument dwukrotnie, prawdopodobnie nie jest pożądany, jak w przypadku ABS(x++). @EOF i @EOF

  2. Zaleta: bez makr. Sekwencyjność punktu końcowego. @EOF

  3. Zaleta: bez makr. -0.0 zwraca -0.0 z numerem OP ABS(). fabs(-0.0) zwraca 0.0. jeśli postępuje zgodnie z arytmetyczną zmiennoprzecinkową IEC 60559.

  4. Zaleta: bez makr. ABS(0.0/0.0) próbuje zmienić znak. (Dotyczy problem rogu).

  5. Zaleta: bez makr. abs(), fabs() są funkcjami standardowymi, łatwo zrozumiałymi dla recenzentów. ABS() nie jest.

  6. Wydajność: znajdź to, co najlepsze na swojej platformie. Co to jest najlepsza (prędkość, rozmiar kodu, rozmiar pamięci) różni się w zależności od kompilatora.

  7. Brak sprawdzania typu za pomocą ABS().

  8. Nie można pobrać adresu makra.

+1

7. Wywołanie funkcji jest punktem sekwencyjnym. 'x = abs (x ++)' dobrze zdefiniowany, 'x = ABS (x ++)' undefined. Nie jestem pewien, że punkt 3 jest szczególnie ważny, sygnatariusz 'NAN' to IIRC definiowany przez implementację. – EOF

+0

@EOF Agree # 3 nie jest na ogół ważna, stąd "sprawa dotycząca sprawy narożnej". – chux