Quando faccio (/ 7 2)
, cosa devo fare per ottenere il risultato 3
? Se lo faccio (/ 7 2.0), ottengo 3.5
, che è come previsto.Divisione di interi in Common Lisp?
risposta
(floor 7 2)
Rif: http://rosettacode.org/wiki/Basic_integer_arithmetic#Common_Lisp
Utilizzare la funzione floor
. In SBCL:
* (floor (/ 7 2))
3
1/2
Vengono restituiti due valori, la parte intera e la parte frazionaria.
È possibile utilizzare la funzione floor
:
(floor 7 2)
3
1
noti che restituisce più valori, ed è necessario solo il primo. Dal momento che floor
restituisce più valori, che può essere fatto con multiple-value-bind
come segue:
(multiple-value-bind (q r) (floor 7 2) q)
=> 3
Edit: Come Rainer fa notare nel suo commento, si può semplicemente passare il risultato di floor
come argomento se tutto ciò che serve è la quoziente.
[1]> (floor 7 2)
3 ;
1
[2]> (+ (floor 7 2) 5)
8
[3]>
che sto lasciando il riferimento alla multiple-value-bind
nella risposta, dal momento che è una funzione importante essere a conoscenza.
come ottengo il primo valore? restituisce una lista ?? – appusajeev
@appusajeev: Ho aggiornato la risposta –
che non è necessaria. il primo valore viene automaticamente passato al prossimo codice. Hai bisogno del MULTIPLE-VALUE-BIND se vuoi tutti i valori o alcuni. (valori (piano 7 2)) restituisce solo il primo. –
Vedere FLOOR, CEILING and TRUNCATE in ANSI Common Lisp.
esempi (vedere i numeri positivi e negativi):
CL-USER 218 > (floor -5 2)
-3
1
CL-USER 219 > (ceiling -5 2)
-2
-1
CL-USER 220 > (truncate -5 2)
-2
-1
CL-USER 221 > (floor 5 2)
2
1
CL-USER 222 > (ceiling 5 2)
3
-1
CL-USER 223 > (truncate 5 2)
2
1
solito per divisione a intero TRUNCATE viene utilizzato.
FLOOR esegue la divisione da solo. – Svante
Vero, ma funziona anche con un singolo argomento. –