gpt4 book ai didi

lisp - LISP中 float 的神秘问题——时间轴生成

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

好的,我确实知道浮点是什么以及如何工作。但是,每当我处理它时,它都不会停止困扰我。

我尝试做一些时间轴生成功能。这个想法很简单。像这样制作smt

(defun make-time-axis (start step stop)
...)

所以,当你用 e.g. 调用它时

(make-time-axis 0 0.1 1.2)

结果会是

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 

但每当我做任何事

(loop for i from 0.0 below 1.2 by 0.1 collect i)

(defun make-time-axis (last step stop)
(cond ((< last stop ) (cons last (make-time-axis (+ last step) step stop )))
(t nil)))

等等

我得到这些结果

(0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.70000005 0.8000001 0.9000001 1.0000001 1.1000001)

任何人都可以告诉我如何获得我想要的东西吗?

最佳答案

如果您知道 float 是如何工作的(您已经阅读了 What Every Computer Scientist Should Know About Floating Point Arithmetic ,对吧?),您应该意识到您得到的正是您所要求的。

数学数字(无论是整数、有理数、实数、复数等等)都有许多有用的属性。例如,x/10 + y/10 = (x+y)/10。这些属性不适用于 float 。

鉴于您的数值结果,在您的实现中, float 0.1 的值似乎略高于数学数字 0.1 的值(不能完全表示为 float )。当你多次累加时,误差最终会超过打印精度。

由于您使用的是 Lisp,因此很容易以精确的形式保留数字(例如有理数 1/10 而不是 float 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))

关于lisp - LISP中 float 的神秘问题——时间轴生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6225211/

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