[帮助]Fix defun出了什么问题
我对这个函数有问题(在我的情况下,它没有答案)(defun test (a)
(setq b (atof a))
(setq c (fix B))
(setq d (rtos C 2 0 ))
(setq e (- b (fix B)))
(setq e1 (* e 100))
(setq e2 (fix e1))
(setq e3(rtos e2 2 0))
(setq g (- e1 (fix e1)))
(setq g1 (* g 100))
(setq g2 (fix g1))
(setq g3(rtos g2 2 0))
(princ (strcat d " d "e3 " m " g3 " s "))(princ)
)
一切似乎都很好,但当我用最后一个带00的字符串测试时,它返回错误。
前任
为什么e1返回22和g2返回99?
请帮帮我。
非常感谢大家^ 由于双精度的舍入,也许可以研究angtof/angtos函数。 我只是猜测它是四舍五入的原因,但不知道在计算过程中发生了什么,所以我担心在其他定义中会出现同样的问题,不仅仅是在度转换中。。。 修复^更有趣 是的,尽量避免使用fix函数-混合整数和浮点数时会出现一些问题。我不太清楚你为什么要这样做——就好像你只是简单地键入dms,但使用了错误的符号。如果执行下一步:(angtos(angtof“45.2300”)1)。。。您得到的值为45d13'48“,因为您的输入是十进制的45+23/100(而不是45+23/60)。
无论如何,试试这个:
实际上,您可以删除最后一行。一、 你只需要操纵字符串。在这种情况下,您可以简单地这样做,以获得准确的“45 23 00”:
或者,如果他们“忘记”输入分/秒,效果会更好:
3 非常感谢irneb,我可以用字符串函数来解决这个问题,但我仍然对#4 post中的“FIX出了什么问题”有疑问。我不知道这里到底有什么问题,我很含糊
哎呀,我是不是应该忘了做点别的事了
fix函数没有任何“错误”。考虑到数字不能像在数学中那样表示为有限的小数位数(因为这显然需要无限的内存),因此一些计算可能会失去一定程度的准确性。
请注意,1.66533e-016的结果非常小,确实处于IEEE 754双精度浮点格式(double)的精度极限,其中数字可以近似为16位小数。
当对双精度值进行等值时(例如,在条件语句中),始终使用具有小公差的等函数来补偿这种舍入效应。 作为一种显示实际情况的方法,请考虑使用尽可能高的精度显示每个变量:
您已经可以看到发生了错误。虽然非常小,但在更多计算中使用值越多,这会开始累积。因为你一直在乘法,然后修正结果得到接下来的2位数字,这会变得越来越糟糕。
用计算机术语来说,只要所有运算和值都是2的幂,这些错误就“不应该”发生。从那时起,这将只是一种立场的转变。但是,看到你的许多计算都是10的幂次运算,一个简单的x10并不是一个“简单”的二进制计算。由于存储这个数字的位数有限,一旦达到需要所有位数的程度,“所谓的”最低有效位就会被丢弃。
fix函数没有考虑到这一点,因为21.99999998的fix仍然只能得到21。它不舍入到最接近的整数,它只是切掉浮点部分。您可以使用自己的舍入函数,而不是fix(虽然ALisp中没有标准函数),或者您可以随时在字符串之间进行转换-尽管这也有其他问题,只需传递错误,而可能会导致更糟糕的结果。 谢谢李和伊尔内布,这让我头脑清醒了。祝你度过愉快的一天(由于英语水平有限,我不知道如何说很多“谢谢你”)
页:
[1]