当使用双浮点时,有没有一种方法可以在普通lisp中显示更少的数字



我正在学习如何在Common Lisp中使用antik包。

我已经在我的.sbclrc中设置了(setf *read-default-float-format* 'double-float),并且我正在使用emacs+sly。有没有一种方法可以在保持精度的同时减少计算输出中的位数?我想要一些类似Octave的输出,它返回exp(1.0(为2.7183

谢谢。

Lisp实现通常需要一定的长度才能正确,特别是它们试图使其成为这样一种情况,即如果您打印并读回某个内容,则在可能的情况下会得到"相同"的内容。特别是Lisp,人们认为

(defun test-rp-consistency (&optional (proto 1.0d0))
(let ((r (random proto)))
(= (read-from-string (with-output-to-string (s)
(print r s)))
r)))

是真的。

然而,如果你不在乎这一点,并且想要更漂亮但错误的输出,那么你也可以这样做。例如:

(defvar *bad-float-print-pprint-dispatch* (copy-pprint-dispatch))
(defun print-float-badly (to f)
(if *print-readably*
;; At least make some effort to be correct
(prin1 f to)
(format to "~4,2F" f)))
(set-pprint-dispatch 'float 'print-float-badly 0 *bad-float-print-pprint-dispatch*)
(defmacro with-bad-float-printing (&body forms)
`(let ((*print-pprint-dispatch* *bad-float-print-pprint-dispatch*))
,@forms))

显然,如果简单地用setf*print-pprint-dispatch*设为*bad-float-print-pprint-dispatch*,您将得到糟糕的全局浮点打印。

您可以将format与"f";(固定格式浮点(规范(手册(。例如,将小数点后的位数限制为4:

CL-USER> (format t "~,4f" (exp 1.0))
2.7183
NIL

format功能强大且灵活。在这本书中可以找到一个很好的介绍。

基于Renzo的回答,您可能可以在print-object上定义一个方法来更改默认行为:

(defmethod print-object ((f double-float) stream)
(format stream "~,4f" f))

点击此处阅读有关print-object的更多信息:http://www.lispworks.com/documentation/HyperSpec/Body/f_pr_obj.htm

最新更新