【问题标题】:Can implicit conversion by Lisp's FORMAT function be controlled?可以控制 Lisp 的 FORMAT 函数的隐式转换吗?
【发布时间】:2017-03-28 17:47:33
【问题描述】:

在尝试将分数四舍五入为 9 位时,我遇到了以下问题:

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

但四舍五入只能精确到 5 位数。我希望format 会自动处理这个问题;即,考虑到表示它所需的位数,将分数转换为双精度,但显然format 不能那样工作。如果你强制这个分数加倍,你会得到:

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

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

我知道format 非常复杂,您当然可以通过调用外部函数来完成此操作,但我希望对~9$ 进行更简单的调整

【问题讨论】:

  • 我不这么认为。如果参数不是FLOAT,它总是被强制转换为SINGLE-FLOAT。没有办法覆盖它。

标签: floating-point format lisp common-lisp


【解决方案1】:

documentation on the format string 声明:

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

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

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

【讨论】:

    【解决方案2】:

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

    如果 arg 是有理数,则将其强制为单个浮点数,然后打印。

    没有提供指定要强制转换的替代类型的规定。

    【讨论】:

      猜你喜欢
      • 2023-02-22
      • 2011-11-09
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2012-10-31
      • 2016-06-21
      相关资源
      最近更新 更多