找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2973|回复: 8

[LISP函数]:含精度的进位Fix

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-9-6 00:27:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  1. ;|
  2. (xd-fix 12.55 0.1)
  3. 12.6
  4. (xd-fix 12.55 0.01)
  5. 12.55
  6. (xd-fix 12.55 1)
  7. 13|;
  8. (defun xd-fix (#s #sr)
  9.   (* (fix (+ (/ (float #s) #sr) 0.5)) #sr)
  10. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-9-6 02:55:54 | 显示全部楼层
或者叫"四舍五入"?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-2-27 12:18:55 | 显示全部楼层
修改为:
[PHP](defun xd-fix (#s #sr)
  (if (> #s 0.0)
  (* (fix (+ (/ (float #s) #sr) 0.5 1e-10)) #sr)
  (* (fix (- (/ (float #s) #sr) 0.5 1e-10)) #sr)
  )
)
[/PHP]
不进行误差控制会发生:(xd-fix 2.55 0.1)=2.5
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-3-17 00:50:58 | 显示全部楼层
命令: (XD-FIX 55555.555555 0.1)
55555.6
命令: (XD-FIX 55555.555555 0.3) ;;;如果写成0.3
55555.5

用整数表示

  1. (defun fix2(num ## / a)
  2.   (setq a (expt 10. ##))
  3.   (* a(fix (+ (/ num a)0.5000000000001)))
  4. )

命令: (rtos (fix2 55555.555555 -3) 2 5)
"55555.55600"

命令: (rtos (fix2 55555.555555 -1) 2 5)
"55555.60000"

命令: (rtos (fix2 55555.555555 1) 2 5)
"55560.00000"

命令: (rtos (fix2 55555.555555 3) 2 5)
"56000.00000"
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-19 13:17:23 | 显示全部楼层
为什么要写成0.3?这个数字是参与运算的,写成0.3误差更难控制
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-24 13:27:04 | 显示全部楼层
受 xyp1964 提示:

(defun myfix (x / mid midd)
(atoi (rtos x 2 0))
)

楼下谁再测试一下看看哪种方法速度最快:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-20 14:31:09 | 显示全部楼层
上面这个函数怎么只有一个参数?位数如何控制?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-5-30 08:17:58 | 显示全部楼层
wujimmy
说的是这样的:
(defun myfix (x y/ mid midd)
  (atoi (rtos x 2 y))
)
如下:
(myfix 12.55 1)
12.6
(myfix 12.55 2)
12.55
(myfix 12.55 0)
13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-30 08:48:02 | 显示全部楼层
速度测试:
结论:差不多

  1. (defun myfix (x y / mid midd)
  2. (atoi (rtos x 2 y))
  3. )
  4. (defun fix2(num ## / a)
  5.   (setq a (expt 10. ##))
  6.   (* a(fix (+ (/ num a)0.5000000000001)))
  7. )
  8. (defun xd-fix (#s #sr)
  9.   (if (> #s 0.0)
  10.   (* (fix (+ (/ (float #s) #sr) 0.5 1e-10)) #sr)
  11.   (* (fix (- (/ (float #s) #sr) 0.5 1e-10)) #sr)
  12.   )
  13. )

  14. (defun c:tt ()
  15.   (setvar "cmdecho" 0)
  16.   (setq re_times 10000)
  17.   (setq funlist (list myfix fix2 xd-fix))
  18.   ;(setq testlist (list 1111 2222 3333 4444 5555 6666 7777 8888 9999))

  19.    (foreach fun funlist
  20.     (progn
  21.       (setq t1 (getvar "date")) ;_记录开始时间t1
  22.       (repeat re_times
  23.         (fun 12.555 2)
  24.       ) ;_repeat
  25.       (setq t2 (getvar "date")) ;_记录结束时间t2
  26.       (princ "函数:")(princ fun)(princ "测试结果")
  27.       (princ (menucmd (strcat "M=$(edtime," (rtos (- t2 t1) 2 16) ",HH:MM:SS:MSEC)")))
  28.       (princ "\n")
  29.     ) ;_progn

  30.   ) ;_foreach
  31.   (setvar "cmdecho" 1)
  32.   (princ)
  33. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 05:56 , Processed in 0.198026 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表