乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 20|回复: 8

[编程交流] [帮助]Fix defun出了什么问题

[复制链接]

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:18:37 | 显示全部楼层 |阅读模式
我对这个函数有问题(在我的情况下,它没有答案)
  1. (defun test (a)
  2. (setq b (atof a))
  3. (setq c (fix B))
  4. (setq d (rtos C 2 0 ))
  5. (setq e (- b (fix B)))
  6. (setq e1 (* e 100))
  7. (setq e2 (fix e1))
  8. (setq e3(rtos e2 2 0))
  9. (setq g (- e1 (fix e1)))
  10. (setq g1 (* g 100))
  11. (setq g2 (fix g1))
  12. (setq g3(rtos g2 2 0))
  13. (princ (strcat d " d "  e3 " m " g3 " s "))(princ)
  14. )

 
一切似乎都很好,但当我用最后一个带00的字符串测试时,它返回错误。
前任
为什么e1返回22和g2返回99?
请帮帮我。
非常感谢大家^
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:31:46 | 显示全部楼层
由于双精度的舍入,也许可以研究angtof/angtos函数。
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:34:29 | 显示全部楼层
我只是猜测它是四舍五入的原因,但不知道在计算过程中发生了什么,所以我担心在其他定义中会出现同样的问题,不仅仅是在度转换中。。。
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:41:42 | 显示全部楼层
修复^更有趣
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:52:43 | 显示全部楼层
是的,尽量避免使用fix函数-混合整数和浮点数时会出现一些问题。我不太清楚你为什么要这样做——就好像你只是简单地键入dms,但使用了错误的符号。如果执行下一步:(angtos(angtof“45.2300”)1)。。。您得到的值为45d13'48“,因为您的输入是十进制的45+23/100(而不是45+23/60)。
 
无论如何,试试这个:
实际上,您可以删除最后一行。一、 你只需要操纵字符串。在这种情况下,您可以简单地这样做,以获得准确的“45 23 00”:
或者,如果他们“忘记”输入分/秒,效果会更好:
  1. 3
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 10:01:28 | 显示全部楼层
非常感谢irneb,我可以用字符串函数来解决这个问题,但我仍然对#4 post中的“FIX出了什么问题”有疑问。我不知道这里到底有什么问题,我很含糊
哎呀,我是不是应该忘了做点别的事了
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:04:37 | 显示全部楼层
 
fix函数没有任何“错误”。考虑到数字不能像在数学中那样表示为有限的小数位数(因为这显然需要无限的内存),因此一些计算可能会失去一定程度的准确性。
 
请注意,1.66533e-016的结果非常小,确实处于IEEE 754双精度浮点格式(double)的精度极限,其中数字可以近似为16位小数。
 
当对双精度值进行等值时(例如,在条件语句中),始终使用具有小公差的等函数来补偿这种舍入效应。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 10:14:23 | 显示全部楼层
作为一种显示实际情况的方法,请考虑使用尽可能高的精度显示每个变量:
您已经可以看到发生了错误。虽然非常小,但在更多计算中使用值越多,这会开始累积。因为你一直在乘法,然后修正结果得到接下来的2位数字,这会变得越来越糟糕。
 
用计算机术语来说,只要所有运算和值都是2的幂,这些错误就“不应该”发生。从那时起,这将只是一种立场的转变。但是,看到你的许多计算都是10的幂次运算,一个简单的x10并不是一个“简单”的二进制计算。由于存储这个数字的位数有限,一旦达到需要所有位数的程度,“所谓的”最低有效位就会被丢弃。
 
fix函数没有考虑到这一点,因为21.99999998的fix仍然只能得到21。它不舍入到最接近的整数,它只是切掉浮点部分。您可以使用自己的舍入函数,而不是fix(虽然ALisp中没有标准函数),或者您可以随时在字符串之间进行转换-尽管这也有其他问题,只需传递错误,而可能会导致更糟糕的结果。
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 10:24:54 | 显示全部楼层
谢谢李和伊尔内布,这让我头脑清醒了。祝你度过愉快的一天(由于英语水平有限,我不知道如何说很多“谢谢你”)
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 03:23 , Processed in 0.472224 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表