Luc*_*uca 6 lisp common-lisp number-formatting
有没有人知道如何在Lisp中为float指定小数点后面的数字?
假如我在REPL上打印此命令:
CL-USER 3 > (format t "~,15f" (float (/ 1 7)))
Run Code Online (Sandbox Code Playgroud)
我明白了:
0.142857150000000
Run Code Online (Sandbox Code Playgroud)
但是数字在小数点后面的第8位进行四舍五入,我需要在小数点后面看到很多位数,以查看数字是否是循环的并计算周期.(实际上我开始尝试解决Project Euler的问题26).
我需要得到这样的东西:
CL-USER 3 > (format t "~,15f" (float (/ 1 7)))
0.142857142857142857142857142857142857....
Run Code Online (Sandbox Code Playgroud)
谢谢,
卢卡
Rai*_*wig 18
Common Lisp在其标准中没有任意精确的浮点数.
:Common Lisp的标准定义了四个浮点类型SHORT-FLOAT,SINGLE-FLOAT,DOUBLE-FLOAT,LONG-FLOAT.
你可以使用函数强制浮动比率COERCE(LispWorks中的例子):
CL-USER 1 > (coerce (/ 1 7) 'double-float)
0.14285714285714285D0
Run Code Online (Sandbox Code Playgroud)
或作为LONG-FLOATCLISP
[1]> (coerce (/ 1 7) 'long-float)
0.14285714285714285714L0
Run Code Online (Sandbox Code Playgroud)
要使用更长的浮点数进行计算,您需要扩展Common Lisp.GNU CLISP有一个非可移植的扩展,可以设置(二进制)数字的数量:
(SETF (EXT:LONG-FLOAT-DIGITS) n)
例:
[3]> (SETF (EXT:LONG-FLOAT-DIGITS) 1000)
1000
[4]> (coerce (/ 1 7) 'long-float)
0.142857142857142857142857142857142857142857142857142857
142857142857142857142857142857142857142857142857142857
142857142857142857142857142857142857142857142857142857
142857142857142857142857142857142857142857142857142857
142857142857142857142857142857142857142857142857142857
142857142857142857142857142857142857143L0
Run Code Online (Sandbox Code Playgroud)