2013-06-02 19 views
14

podawano dwie liczby całkowite:Dlaczego `a^b` zwraca wartość numeryczną, gdy" a "i" b "są liczbami całkowitymi?

a <- 1L 
b <- 1L 

Jak można się spodziewać, dodawanie, odejmowanie lub mnożenie je również daje liczbę całkowitą:

class(a + b) 
# [1] "integer" 
class(a - b) 
# [1] "integer" 
class(a * b) 
# [1] "integer" 

Ale im podzielenie daje liczbowy:

class(a/b) 
# [1] "numeric" 

Myślę, że rozumiem dlaczego: ponieważ inne kombinacje liczb całkowitych (np. a <- 2L i b <- 3L) zwrócą liczbę, jest to bardziej ważne, aby zawsze zwracać wartość liczbową.

Teraz na potęgowanie:

class(a^b) 
# [1] "numeric" 

Ten jest trochę dla mnie zaskoczeniem. Czy ktoś może wyjaśnić, dlaczego został zaprojektowany w ten sposób?

+2

Myślę, że to dlatego, że wynik może prowadzić do 'Inf' ?? 'as.integer (Inf)' spowodowałoby 'NA'. Np .: 2L^10000L – Arun

+1

Podczas gdy podoba mi się wybrana odpowiedź, być może należałoby zapytać, czy jest jakaś korzyść z posiadania faktycznego kodu potęgowania, aby utworzyć kolejną "skrzynkę narożną". Zwłaszcza jeśli kod 'R' lub' unix' 'pow', które można nazwać, używa logów do obliczenia wykładników w pierwszej kolejności. –

Odpowiedz

17

Obejmuje przypadek, gdy wykładnik jest ujemny.

6

Zastanów się, ^ jako rodzina funkcji, f(a)(b) = a^b. Dla domeny a=2 domena, dla której zwracana jest liczba całkowita, jest ograniczona do wartości [0,62] (przy założeniu 64-bitowych liczb całkowitych ze znakiem). To jest bardzo mały podzbiór ważnych danych wejściowych. Domena staje się coraz mniejsza jako wzrosty o a.

+0

interesujące. Myślę, że bardziej podoba mi się odpowiedź Roba Lyndona ("liczby całkowite nie są zamknięte [matematycznie] w ramach operacji"^"), ale twoja jest rozsądna (" liczby całkowite nie są zamknięte [obliczeniowo] w ramach operacji "^") - - ale to staje się trudne, ponieważ trzeba zacząć decydować o bzdurnych/pragmatycznych podstawach ... –

0

Jego proste dodawanie, odejmowanie, mnożenie i dwa wyniki liczb całkowitych liczby całkowitej. podczas dzielenia lub wykonywania potęgowania wyniki w liczbie z/bez dziesiętnych, dlaczego pokazano numeryczne zamiast liczby całkowitej.

+0

i taka jest już zaakceptowana odpowiedź ... – flodel

0

Czy możliwe a^b został wdrożony jako coś podobnego exp(b * log(a))?

+1

Bez dowodu, tego rodzaju uwagi najlepiej pozostawić jako komentarz imo. –

+0

Dziwnie :-) to był mój komentarz jakiś czas temu. Powinienem być bardziej proaktywny i zajrzeć do podstawowego kodu źródłowego. –