如何使用双浮?

lur*_*ker 7 lisp common-lisp

我正在努力想弄清楚如何告诉Lisp我想使用双浮点值.假设我有:

(let ((x 1)) (format t "~A~%" (/ x 3.0)))
Run Code Online (Sandbox Code Playgroud)

这使:

0.33333334
Run Code Online (Sandbox Code Playgroud)

如果我想使用double-float,我试过这个:

(let ((x 1)) (declare (type double-float x)) (format t "~A~%" (/ x 3.0)))
0.33333334
Run Code Online (Sandbox Code Playgroud)

所以结果不是双浮动.但是,我可以像这样强制双浮:

(let ((x 1)) (format t "~A~%" (/ x 3.0d0)))
0.3333333333333333d0
Run Code Online (Sandbox Code Playgroud)

现在我得到了双浮动结果.

所以我的问题是:如果我正在定义一个表单或函数,我希望算术在双浮点中,我该如何建立它?我已经使用读大量的网上资源declare,proclaim等等,但一直无法将它应用到越来越结果我之后.我不相信我知道如何在这种情况下使用它们,或者即使它们是正确使用的机制.

如果我正在尝试执行相同的问题long-float或其他不是默认的问题.

Rai*_*wig 8

如果你想用特殊的浮点格式计算,你必须告诉它.通常如果你划分双浮点数,结果将是双浮点数.如果你有常量,你需要表示它们.

Common Lisp标准说:数值函数的结果是函数的所有浮点参数中最大格式的浮点数..

以下解释取决于一些事情.这取决于读者如何读取数字.对于整数,可以指定基数.对于浮点数,它取决于默认的浮点格式.

(let ((x 1)) (format t "~A~%" (/ x 3.0)))
Run Code Online (Sandbox Code Playgroud)

让我们看看*read-default-float-format*它是如何影响它的:

CL-USER 9 > *read-default-float-format*
SINGLE-FLOAT

CL-USER 10 > (let ((x 1)) (format t "~A~%" (/ x 3.0)))
0.33333334
NIL

CL-USER 11 > (setf *read-default-float-format* 'double-float)
DOUBLE-FLOAT

CL-USER 12 > (let ((x 1)) (format t "~A~%" (/ x 3.0)))
0.3333333333333333
NIL
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以使用指数标记指定文字数字的类型:

  • d =双浮
  • e =浮动的 *read-default-float-format*
  • f =单浮点数
  • l =长浮动
  • s =短期浮动

例:

CL-USER 15 > (setf *read-default-float-format* 'single-float)
SINGLE-FLOAT

CL-USER 16 > (let ((x 1)) (format t "~A~%" (/ x 3.0d0)))
0.3333333333333333D0
NIL
Run Code Online (Sandbox Code Playgroud)

您还可以将数字强制转换为某种类型.该函数COERCE使您明确表示您的类型:

CL-USER 17 > (let ((x 1))
               (format t "~A~%" (/ (coerce x 'double-float) 3.0)))
0.3333333333333333D0
NIL
Run Code Online (Sandbox Code Playgroud)