2017-08-22 13 views
7

Czy istnieje różnica w funkcjonalności między floor i truncate w Haskell?Czy istnieje różnica między podłogą a ucięciem w Haskell

Wydają się wykonać te same funkcje i mają ten sam podpis typu:

  • truncate :: (Integral b, RealFrac a) => a -> b
  • floor :: (Integral b, RealFrac a) => a -> b
+4

Razem Haskell początkujących, ale jak w większości innych języków, będziesz prawdopodobnie zobaczyć różnicę z liczb ujemnych ... – deceze

+1

To był rzeczywiście mój problem. :) Dzięki! –

Odpowiedz

16

Tak, dla liczb ujemnych. Jeśli czytamy w dokumentacji, widzimy:

truncate :: Integral b => a -> b

truncate x zwraca liczbę całkowitą najbliższy x między zero i x

oraz:

floor :: Integral b => a -> b

floor x zwraca największą liczbę całkowitą nie większą niż x

Jeśli więc wprowadzić liczbę ujemną, jak -3.5 otrzymujemy:

Prelude> truncate (-3.5) 
-3 
Prelude> floor (-3.5) 
-4 
+1

Dziękuję za jasną odpowiedź i odniesienie do dokumentów. Rzeczywiście tylko sprawdzałem to z liczbami dodatnimi. –

6

To nie Haskell specyficzny, ale istnieje różnica między tymi funkcjami. Piętro oznacza najwyższą liczbę całkowitą nie większą niż podana liczba. Obcięcie oznacza usunięcie na pewnej długości, w tym przypadku części ułamkowej. Mają taki sam efekt dla zerowych i dodatnich liczb, ale nie dla negatywnych.

Oto krótkie porównanie w Pythonie:

>>> for i in range(-5,6): 
... j=0.5*i 
... print(j,floor(j),ceil(j),trunc(j),round(j)) 
... 
-2.5 -3 -2 -2 -2 
-2.0 -2 -2 -2 -2 
-1.5 -2 -1 -1 -2 
-1.0 -1 -1 -1 -1 
-0.5 -1 0 0 0 
0.0 0 0 0 0 
0.5 0 1 0 0 
1.0 1 1 1 1 
1.5 1 2 1 2 
2.0 2 2 2 2 
2.5 2 3 2 2 

Zasadniczo trunc() idzie w kierunku zera i podłogi() w kierunku ujemnym nieskończoności.

1

Obetnij:

1 --> 1 
3.1 --> 3 
3.9 --> 3 
-2.1 --> -2 
-2.9 --> -2 

Piętro:

1 --> 1 
3.1 --> 3 
3.9 --> 3 
-2.1 --> -2 
-2.9 --> -3 (Different!...) 
+1

Pamiętaj, że 'floor (-2.1)' to '-3'. –

3

Patrząc na kod źródłowy różnica wyłania się dość szybko:

truncate x   = m where (m,_) = properFraction x 

i

floor x    = if r < 0 then n - 1 else n 
         where (n,r) = properFraction x 

widzimy różnicę wyjdzie tylko na liczbach ujemnych i tak:

Prelude> floor (negate 2.1) 
-3 
Prelude> truncate (negate 2.1) 
-2 
Powiązane problemy