2013-06-02 9 views
14

Dati due interi:Perché `a^b` restituisce un valore numerico quando sia` a` che `b` sono numeri interi?

a <- 1L 
b <- 1L 

come mi sarei aspettato, aggiungendo, sottraendo, o moltiplicando anche dà un numero intero:

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

Ma dividendo dà loro un numerica:

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

Penso di poter capire perché: perché altre combinazioni di numeri interi (ad esempio a <- 2L e b <- 3L) restituiscono un valore numerico, è il più generale cosa fare per restituire sempre un valore numerico.

Ora sopra elevamento a potenza:

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

questo è un po 'una sorpresa per me. Qualcuno può spiegare perché è stato progettato in questo modo?

+2

Immagino sia perché il risultato può portare a 'Inf' ?? 'as.integer (Inf)' risulterebbe in 'NA'. Es: 2L^10000L – Arun

+1

Mentre mi piace la risposta selezionata, forse si potrebbe chiedere se ci sia qualche vantaggio nell'avere il codice effettivo per l'esponenziazione che crea ancora un altro "caso d'angolo". Soprattutto se il codice 'R' o' unix' 'pow' che può essere chiamato usa i log per calcolare gli esponenti in primo luogo. –

risposta

17

Questo copre il caso in cui l'esponente è negativo.

6

Considerare ^ come una famiglia di funzioni, f(a)(b) = a^b. Per a=2, il dominio per cui questo restituisce numero intero è limitato ai valori [0,62] (presupponendo numeri interi con segno a 64 bit). Questo è un sottoinsieme molto piccolo degli input validi. Il dominio diventa più piccolo con incrementi di a.

+0

interessante. Penso che mi piaccia la risposta di Rob Lyndon ("i numeri interi non sono chiusi [matematicamente] sotto l'operazione'^'"), ma il tuo è ragionevole ("gli interi non sono chiusi [computazionalmente] sotto l'operazione'^'") - - ma questo diventa complicato perché si deve iniziare a decidere su basi molli/pragmatiche ... –

0

L'aggiunta, la sottrazione e la moltiplicazione di due numeri interi risultano in numeri interi. mentre dividendo o eseguendo l'esponenziazione si ottiene un numero con/senza decimali che indica il motivo numerico anziché intero.

+0

e questo è quello che la risposta accettata ha già detto ... – flodel

0

È possibile che a^b sia stato implementato come qualcosa come exp(b * log(a))?

+1

Senza prove, questo tipo di osservazione è meglio lasciare come commento imo. –

+0

Stranamente :-) questo è stato il mio commento qualche tempo fa. Dovrei essere più proattivo e dare un'occhiata al codice sorgente di base. –