可以控制Lisp的FORMAT函数的隐式转换吗?

时间:2017-03-28 17:47:34

标签: floating-point format lisp common-lisp

在尝试将分数舍入到9位数时,我遇到了以下内容:

? (format t "~9$" 763700091/112000148)
6.818742300
Nil

但是舍入仅精确到5位数。我希望format会自动处理这个问题;也就是说,给定表示它所需的位数,将分数转换为双精度,但显然format不起作用。如果你强迫这个分数加倍,你会得到:

? (coerce 763700091/112000148 'double-float)
6.818741802019762D0

是否有控制指令指示format在这种情况下使用双精度。或者我必须将分数强制转换为double-float,然后再将其传递给格式化以完成此操作?

我知道format非常复杂,你可以通过调用外部函数来实现这一点,但我希望通过更简单的调整来实现~9$

2 个答案:

答案 0 :(得分:8)

documentation on the format string州:

  

如果arg是有理数,那么它被强制为单个浮点数   然后打印出来。

因此,您的问题的答案是,但是您可以轻松地将您所做的工作与您刚刚强制转换为双浮点数的数字相结合:

(format nil "~9$" (coerce 763700091/112000148 'double-float))
; ==> "6.818741802"

答案 1 :(得分:4)

这是不可能的。来自CLHS 22.3.3.4 Tilde Dollarsign: Monetary Floating-Point

  

如果arg是有理数,那么它被强制为单个浮点数然后打印。

未提供任何规定来指定强制转换的替代类型。