当前位置:  开发笔记 > 开发工具 > 正文

如何在Lisp中格式化REPL输出的数字精度?

如何解决《如何在Lisp中格式化REPL输出的数字精度?》经验,为你挑选了1个好方法。

我的问题是:
如何设置REPL打印输出的精度?

举个例子,这个简单的函数在这里:

(defun gaussian (rows cols sigma)
  (let ((filter (make-array `(,rows ,cols)))
    (rowOffset (/ (- rows 1) 2.0))
    (colOffset (/ (- cols 1) 2.0)))
    (loop for i from 0 to (- rows 1)
       do (loop for j from 0 to (- cols 1)
           do (setf (aref filter i j)
            (gaussDistVal i j rowOffset ColOffset sigma))))
    filter))

如果我打电话(gaussian 5 5 1),我的输出如下:

#2A((0.01831564 0.082085 0.13533528 0.082085 0.01831564)
    (0.082085 0.36787945 0.60653067 0.36787945 0.082085)
    (0.13533528 0.60653067 1.0 0.60653067 0.13533528)
    (0.082085 0.36787945 0.60653067 0.36787945 0.082085)
    (0.01831564 0.082085 0.13533528 0.082085 0.01831564))

虽然我想得到:

#2A((0.0 0.1 0.1 0.1 0.0)
    (0.0 0.4 0.6 0.4 0.1)
    (0.1 0.6 1.0 0.6 0.1)
    (0.0 0.4 0.6 0.4 0.1)
    (0.0 0.1 0.1 0.1 0.0))

如果您有答案,还能告诉我这些"REPL定制"的记录在哪里吗?

(SBCL 1.2.11; Emacs 25上的史莱姆)



1> Rainer Joswi..:

使用Common Lisp漂亮的打印机

Common Lisp拥有广泛的漂亮打印机.很少使用的特征是用于控制某种类型的对象的打印的调度表.请参阅set-pprint-dispatch如何配置此功能.

该函数format具有输出各种形式的浮点数的功能.

这个例子结合了两个:

CL-USER 32 > (set-pprint-dispatch 'float
                                  #'(lambda (s obj)
                                      (format s "~,1F" obj)))
NIL

CL-USER 33 > (setf *print-pretty* t)
T

CL-USER 34 > #2A((0.01831564 0.082085 0.13533528 0.082085 0.01831564)
                 (0.082085 0.36787945 0.60653067 0.36787945 0.082085)
                 (0.13533528 0.60653067 1.0 0.60653067 0.13533528)
                 (0.082085 0.36787945 0.60653067 0.36787945 0.082085)
                 (0.01831564 0.082085 0.13533528 0.082085 0.01831564))

#2A((0.0 0.1 0.1 0.1 0.0)
    (0.1 0.4 0.6 0.4 0.1)
    (0.1 0.6 1.0 0.6 0.1)
    (0.1 0.4 0.6 0.4 0.1)
    (0.0 0.1 0.1 0.1 0.0))

人们可能也想暂时使用它:

CL-USER 37 > (let ((*print-pprint-dispatch* (copy-pprint-dispatch)))
               (set-pprint-dispatch 'float
                                    #'(lambda (s obj)
                                        (format s "~,1F" obj)))
               (pprint #2A((0.01831564 0.082085 0.13533528 0.082085 0.01831564)
                           (0.082085 0.36787945 0.60653067 0.36787945 0.082085)
                           (0.13533528 0.60653067 1.0 0.60653067 0.13533528)
                           (0.082085 0.36787945 0.60653067 0.36787945 0.082085)
                           (0.01831564 0.082085 0.13533528 0.082085 0.01831564))))

#2A((0.0 0.1 0.1 0.1 0.0)
    (0.1 0.4 0.6 0.4 0.1)
    (0.1 0.6 1.0 0.6 0.1)
    (0.1 0.4 0.6 0.4 0.1)
    (0.0 0.1 0.1 0.1 0.0))

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有