2015-02-02 23 views
7

Piszę kod C, aby wielokrotnie zaokrąglać w górę iw dół do wartości całkowitych. Standardowa biblioteka matematyczna C zawiera funkcje floor() i ceil(). zauważyłem, że znacznie szybsza realizacja funkcji jest oddać bezpośrednio do liczb całkowitych:Funkcje floor() i ceil() vs rzutowanie na liczbę całkowitą w C

int up, down; 
float test = 1.3548; 

up = (int)(test + 1); //ceil() 
down = (int)test;  //floor() 

Zrobiłem szybki test i to wydaje się działać prawidłowo.

  1. Jest to niezawodny sposób zaokrąglić górę i w dół, jeśli trzeba którego jest liczbą całkowitą, jako wskaźnika macierzy (to zawsze zwraca prawidłowe wyniki)?
  2. Czy istnieje silny powód znacznego wzrostu prędkości? (W moim systemie działa około 3 razy szybciej niż realizacja math.h)
+7

Nie jest to niezawodna metoda. Rozważmy przypadek, w którym 'test' jest wartością całkowitą, taką jak' 4.0'. W tym przypadku 'floor (x) == ceil (x)', ale twój kod zwróci 'up = 5; dół = 4'. – njuffa

+1

Czy jesteś pewien, że jest to szybsze? Pokaż nam swój test wydajności! – Sulthan

+0

Zależy od tego, co masz na myśli, mówiąc "niezawodny". Jeśli "niezawodny" oznacza "zadziała", to tak. Ale jeśli masz na myśli coś więcej, np. "Zawsze będzie zaokrąglane w dół/w górę/najbliższe/do zera/etc ...", to nie ... Pamiętaj, aby wypróbować różne metody na liczbach dodatnich i ujemnych, a także jako te, które mogą znajdować się poza zakresem 'int', aby zobaczyć, co się dzieje, więc możesz wybrać" poprawną "metodę dla twojej konkretnej sytuacji ... Och, a to powinno być prawdopodobnie' up = (int) (test + 0.5) '- pomyśl o tym ... – twalberg

Odpowiedz

7

Funkcje ceil() i floor() powróci różne numery niż to, co można uzyskać za pomocą

up = (int)(test + 1); 
down = (int)test; 

kiedy masz negatywne numer.

Jeśli masz:

float test = -1.3548; 
up = (int)test;  // ceil() 
down = (int)(test-1); // floor() 

Nawet ostatnie stwierdzenie nie jest dobrym sposobem, aby obliczyć floor() gdy test jest liczbą całkowitą.

Jeśli nie chcesz inaczej radzić sobie z liczbami dodatnimi i ujemnymi, a szczególne przypadki, kiedy test jest liczbą całkowitą, lepiej jest użyć ceil() i floor().

+1

i dla 'round()' use: '(int) (test + 0.5f)' – Iggy

+3

'(int) (test - 1)' nie jest równoważne z 'floor()' dla całkowych liczb ujemnych. –

+0

@TheParamagneticCroissant, doskonały punkt. –