LISP - 小数点后的数字

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)