【问题标题】:Field evaluated to the values (0.0), not of type SHORT-FLOAT字段评估为值 (0.0),不是 SHORT-FLOAT 类型
【发布时间】:2016-07-16 12:21:01
【问题描述】:

我最近发现可以为结构添加类型限制,但是无论出于何种原因,它都不允许 0.0 作为短浮点数的合法默认值,但它确实允许 100.0

当我尝试在 CLisp 中运行 make-ship 以创建 ship 结构的实例时出现以下错误:

[4]> (make-ship)

*** - THE: #:ENERGY evaluated to the values (0.0), not of type SHORT-FLOAT
The following restarts are available:
ABORT          :R1      Abort main loop

谁能解释到底发生了什么,为什么我不允许使用 0.0?

这是行为不端的代码:

(defstruct ship
  location ;; fields like these have an undecided type at the moment
  (energy 0.0 :type short-float)
  cargo
  crew
  shields
  (hull-integrity 100.0 :type short-float))

【问题讨论】:

标签: types common-lisp record


【解决方案1】:

Common Lisp 具有用于不同类型浮点数的语法,在2.3.2.2 Syntax of a Float 中进行了描述。其中一个示例显示了如何将 0 写为短浮点数:0s00.0s0 都可以。

【讨论】:

  • 奇怪的是我使用的代码直接取自 hyperspec 中的结构示例
  • 目前无法检查,但请查看默认浮点格式等。我希望系统可以在未指定类型时读取浮点数具有一定的灵活性。因此,规范中的示例可能是合法的,但不是强制性的。
【解决方案2】:

当没有exponent marker,或者指数标记处使用“e”时,则读入的浮点数的类型由全局变量*READ-DEFAULT-FLOAT-FORMAT*决定,默认为SINGLE-FLOAT,即不一定是 SHORT-FLOAT。

【讨论】:

    【解决方案3】:

    CLisp 似乎可以区分SINGLE-FLOAT0.00.0e0)和SHORT-FLOAT0s0)。因此,调用(make-ship) 失败。修复:要么需要将0.0100.0 分别替换为0s0100s0,要么将所有SHORT-FLOAT 替换为SINGLE-FLOAT

    PS:在 SBCL 和 ECL 中,示例都按原样工作,因为它们都不区分这些浮点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 2020-11-09
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      相关资源
      最近更新 更多