我正在努力想弄清楚如何告诉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或其他不是默认的问题.
如果你想用特殊的浮点格式计算,你必须告诉它.通常如果你划分双浮点数,结果将是双浮点数.如果你有常量,你需要表示它们.
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)
另请注意,您可以使用指数标记指定文字数字的类型:
*read-default-float-format*例:
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)
| 归档时间: |
|
| 查看次数: |
3836 次 |
| 最近记录: |