Cer*_*dav 2 lisp floating-point
好的,我知道什么以及如何工作浮点.但是,每当我处理它时,它都不会让我感到困惑.
我尝试做一些时间轴生成功能.这个想法很简单.要像这样做smt
(defun make-time-axis (start step stop)
...)
Run Code Online (Sandbox Code Playgroud)
所以,当你用例如
(make-time-axis 0 0.1 1.2)
Run Code Online (Sandbox Code Playgroud)
结果将是
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1
Run Code Online (Sandbox Code Playgroud)
但每当我做任何事情
(loop for i from 0.0 below 1.2 by 0.1 collect i)
Run Code Online (Sandbox Code Playgroud)
要么
(defun make-time-axis (last step stop)
(cond ((< last stop ) (cons last (make-time-axis (+ last step) step stop )))
(t nil)))
Run Code Online (Sandbox Code Playgroud)
等等
我得到了这些结果
(0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.70000005 0.8000001 0.9000001 1.0000001 1.1000001)
Run Code Online (Sandbox Code Playgroud)
anybode能给我一些线索如何得到我想要的东西吗?
Gil*_*il' 12
如果你知道浮点是如何工作的(你已经读过每个计算机科学家应该知道的关于浮点算术的内容,对吗?),你应该意识到你得到了你所要求的.
数学数字(无论是整数,有理数,实数,复数,等等)都有许多有用的属性.例如,x/10 + y/10 =(x + y)/ 10.这些属性不适用于浮点数.
给出您的数值结果,似乎在您的实现中,浮点数0.1的值略高于数学数字0.1的值(这不能完全表示为浮点数).当您多次添加时,错误最终会超出打印精度.
由于您使用的是Lisp,因此很容易以精确的形式保留数字(例如,合理的1/10而不是浮点数0.1)并在最后一刻转换它们.
(loop for i from 0 below 12/10 by 1/10 collect (float i))
(mapcar #'float (make-time-axis 0 1/10 12/10))
Run Code Online (Sandbox Code Playgroud)