gpt4 book ai didi

lisp - 如何使用双 float ?

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:30 25 4
gpt4 key购买 nike

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

(let ((x 1)) (format t "~A~%" (/ x 3.0)))

给出:

0.33333334

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

(let ((x 1)) (declare (type double-float x)) (format t "~A~%" (/ x 3.0)))
0.33333334

所以结果不是双 float 。但是,我可以像这样强制双重 float :

(let ((x 1)) (format t "~A~%" (/ x 3.0d0)))
0.3333333333333333d0

现在我得到了一个双浮点结果。

所以我的问题是:如果我要定义一个形式或函数,我希望算术在其中是双 float ,我该如何建立它?我已经阅读了很多关于使用 declareproclaim 等的在线资源,但无法将其应用于获得我想要的结果。我不相信我知道如何在这种情况下利用这些,或者即使它们是正确的使用机制。

如果我尝试执行 long-float 或任何其他非默认设置,同样的问题也适用。

最佳答案

如果你想用一种特殊的浮点格式进行计算,你必须告诉它。通常,如果除以双 float ,结果将是双 float 。如果您有常量,则需要这样表示它们。

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

以下内容的解释取决于几件事。这取决于读者如何阅读数字。对于整数,可以指定基数。对于 float ,它取决于默认的 float 格式。

(let ((x 1)) (format t "~A~%" (/ x 3.0)))

让我们看看如何*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

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

  • d = 双 float
  • e = *read-default-float-format* 的 float
  • f = 单 float
  • l = 长 float
  • s = 短 float

例子:

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

您还可以 数字转换为特定类型。函数COERCE明确表示您的意思是哪种类型:

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

关于lisp - 如何使用双 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com