Lisp:相同的数学函数在不同的时间评估不同的值?

ram*_*rur 7 lisp common-lisp

我必须计算这样的多项式 -

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

这个lisp函数 -

(defun polynomial (x)
  (+ (+ (+ (+ (expt x 4) (* -2.274 * (expt x 3)))
       (* 1.8 (* x x))) (* -0.576 x)) 0.1))
Run Code Online (Sandbox Code Playgroud)

当我调用(多项式0.5)时,结果在不同的评估中是不同的,如下所示 -

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> 
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事 ?我正在使用最新的sbcl.

Syl*_*ter 17

*在参数位置评估您在REPL中的最后一个结果.在你的代码做的(* -2.274 * (expt x 3))地方*-1.9495第一次运行之后,或许.(如果最后一个结果不是数字,第一次运行时会出错.)

你可以有两个参数*,+并且所有LISP都有波兰前缀表示法,所以你的函数可能看起来更像这样:

;; 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
Run Code Online (Sandbox Code Playgroud)

基本上x + y + z在中缀变成(+ x y z)前缀.