2014-09-23 11 views
7

devo calcolare un polinomio simili -Lisp: la stessa funzione matematica valuta valori diversi in tempi diversi?

f (x) = x^4 - 2.274x^3 + 1.8x^2 - 0.576x + 1.0

con questa funzione lisp -

(defun polynomial (x) 
    (+ (+ (+ (+ (expt x 4) (* -2.274 * (expt x 3))) 
     (* 1.8 (* x x))) (* -0.576 x)) 0.1)) 

quando chiamo (polinomiale 0,5) il risultato è diverso a diverse valutazioni, come questo -

CL-USER> (polynomial 0.5) 
-1.9495 
CL-USER> (polynomial 0.5) 
0.8786454 
CL-USER> (polynomial 0.5) 
0.07474504 
CL-USER> (polynomial 0.5) 
0.3032537 
CL-USER> (polynomial 0.5) 
0.23830011 
CL-USER> 

cosa sta succedendo? Sto usando l'ultimo sbcl.

risposta

17

* in posizione argomento restituisce il molto ultimo risultato si aveva in REPL. Nel codice si fa (* -2.274 * (expt x 3)) dove * è -1.9495 forse dopo la prima manche. (Si otterrebbe un errore quando si esegue per la prima volta se l'ultimo risultato non era un numero.)

si può avere più argomenti per entrambe le * e + e tutte le lische ha notazione prefissa polacco così la funzione potrebbe essere meglio in questo modo:

;; f(x) = x^4 - 2.274x^3 + 1.8x^2 - 0.576x + 1.0 
(defun polynomial (x) 
    (+ (expt x 4) 
    (* -2.274 (expt x 3)) 
    (* 1.8 x x) 
    (* -0.576 x) 
    1.0)) ;; this was originally 0.1 

(polynomial 0.5) ; ==> 0.94025004 

Fondamentalmente x + y + z in infisso diventa (+ x y z) in prefisso.

+0

'(* -2,274 * (expt x 3))' stato un mio errore di codifica e la REPL sta assegnando i valori a '' *! ora capisco perché la lisp è una tecnologia aliena. – ramgorur

+0

Questo non è * tutto * quello strano. Il python repl non fa una cosa simile con '_'? Vedi anche **, ***, /, // e ///. –

+1

@JoshuaTaylor IMO '*' all'interno di 'defun' dovrebbe generare un avviso in un SBCL di solito prolisso, mentre non lo aspetterei in altre implementazioni. – Sylwester

Problemi correlati