从 Common Lisp 到 Scheme 的一個坑

看 SICP 的時候发現的。

Welcome to Racket v6.11.
> (* 1.1 1.1)
1.2100000000000002
> (define (square x) (exp (double (log x))))
> (define (double x) (+ x x)) ;; 用 `(* x 2)' 也一樣
> (square 1.1)
1.2100000000000002
> (* 11 11);; 為了数学不好的人
121

用 Guile 和 Scheme48 会得同樣结果。NewLisp 压根不支持浮点计算。

Common Lisp 就比較符和 Common Sense 了:

Welcome to Clozure Common Lisp Version 1.11-r16635  (DarwinX8632)!

CCL is developed and maintained by Clozure Associates. For more information
about CCL visit http://ccl.clozure.com.  To enquire about Clozure's Common Lisp
consulting services e-mail [email protected] or visit http://www.clozure.com.

? (* 1.1 1.1)
1.21
? (defun double (x) (+ x x))
DOUBLE
? (defun square (x) (exp (double (log x))))
SQUARE
? (square 1.1)
1.21
? 

然後保險起見用 Emacs Lisp 试了:

(* 1.1 1.1)
1.2100000000000002

(defun double (x) (+ x x))
double

(defun square (x) (exp (double (log x))))
square

(square 1.1)
1.2100000000000002

原來 Common Lisp 这樣在底层就支持高精度浮點才是少數啊。:joy:

2 个赞

common-lisp 只是伪装得好,多试一下就露馅了:

(- 1.2 1.0) ;; => 0.20000005

欢迎来到机器人世界 → https://0.30000000000000004.com/

6 个赞
Welcome to Clozure Common Lisp Version 1.11-r16635  (DarwinX8632)!

CCL is developed and maintained by Clozure Associates. For more information
about CCL visit http://ccl.clozure.com.  To enquire about Clozure's Common Lisp
consulting services e-mail [email protected] or visit http://www.clozure.com.

? (+ 0.1 0.2)
0.3

⋯⋯ 看來用 Common Lisp 写的 Bot 沒机器人权。

(+ 0.001 0.001000000001) ;; => 0.002 ;;Clozure Common Lisp Version 1.12-dev linux

2 个赞

这不是因为CL高精度,恰恰相反,是因为CL默认低精度,使用的single float。你换成double (* 1.1d0 1.1d0)就会显示1.2100000000000002D0。 你在Racket中(* 1.1s0 1.1s0)也能得到1.21的效果。

2 个赞

真正高精度的來了。

居然看到了 factor!一直很喜欢 forth 系,但却不知道可以拿它来干嘛?桌面上倒一直都开着个 factor listener,只是拿来当计算器用,有点暴殄天物了。

因为喜欢 factor,手机上的计算器都装个支持 RPN Operation 的 RealCalc

BTW. Newlisp 是支持浮点的,只是浮点的运算符是 add、sub、mul、div 而已,也是高精度的。

newLISP v.10.7.1 64-bit on OSX IPv4/6 UTF-8, options: newlisp -h
> (mul 1.1 1.1)
1.21
> (add 0.1 0.2)
0.3
> (sub 1.2 1.0)
0.2
>
1 个赞

求教 factor 是啥

https://factorcode.org/