找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1821|回复: 10

[讨论]:请问R14的AutoLISP中有判断小数位数的函数吗?

[复制链接]
发表于 2005-10-11 20:23:44 | 显示全部楼层 |阅读模式

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

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

×
我查了手头的一些资料好像没有,就是判断一个数有多少位小数的函数,如3.1234应能返回4的函数,请指教!谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-12 00:13:53 | 显示全部楼层

Re: [讨论]:请问R14的AutoLISP中有判断小数位数的函数吗?

最初由 ashan 发布
[B]我查了手头的一些资料好像没有,就是判断一个数有多少位小数的函数,如3.1234应能返回4的函数,请指教!谢谢! [/B]

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

使用道具 举报

 楼主| 发表于 2005-10-12 20:05:50 | 显示全部楼层
谢谢斑竹,虽然斑竹是用vlisp函数而不是纯AutoLISP函数,但提供了一个很好的解决思路,但解决得还不完美,如下面的小数就会返回错误的结果:
_$ (- (strlen (vl-princ-to-string (- 3.0000001 3))) 2)
6
正确结果应该返回7
不知道有没有更好的解决方法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-12 20:49:20 | 显示全部楼层
可能这个和acad的位数有关
比如
(setq a 0.00000001)
1.0e-008
命令: !a
1.0e-008
(setq a 0.0000000123456789)
1.23457e-008

位数太多可能不行,得看这个数怎么表达,假如是由字符串的,就应该可以
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-12 20:52:17 | 显示全部楼层
这是计算机浮点运算的原因

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

使用道具 举报

 楼主| 发表于 2005-10-12 21:26:38 | 显示全部楼层
最初由 eachy 发布
[B]这是计算机浮点运算的原因

_$ (rtos (- 3.0000000000000001 3) 2 24)
"0.000000000000000" [/B]

那么在R14中的浮点数可以精确到多少位呢?在“单位”设置里最大可以设置8位小数(也就是luprec系统变量的值),那么我想如果要自己写这个函数的话最起码也应该在8位(包含8位)小数的情况下能得到正确的结果,请大家继续发表意见!

我刚才自己用纯AutoLISP写了一个子程序,最大可判断到8位,初步测试是可以的,还没进一步完善,请大家帮我看看,改进改进:
(defun xsws (datt / ddn1 ddn2 i)
  (setq ddn1 datt)
  (setq ddn2 (fix ddn1))
  (setq i 0)
  (while (> (- ddn1 ddn2) 1e-9)
    (setq ddn1 (* ddn1 10.0))
    (setq ddn2 (fix ddn1))
    (setq i (1+ i))
    (if        (= i 8)
      (setq ddn1 ddn2)
    )
  )
  (setq i i)
)
测试:
_$ (xsws 3.00000001)
8
_$ (xsws 456.0002544505)
8
_$ (xsws 32.02)
2
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 11307个

财富等级: 富甲天下

发表于 2005-10-12 23:13:50 | 显示全部楼层
在ACAD中实数的小数位数一般精度是16位。我将楼主的程序改了一下,可测的位数多些,可是小数的位数大于12后就出错,返回值不对了。

  1. (defun xsws (datt / ddn1 i)
  2. (setq ddn1 datt i 0)
  3. (while (> (- ddn1 (fix ddn1)) 1e-20)
  4. (setq ddn1 (* ddn1 10) i (1+ i))
  5. )
  6. i
  7. )
  8. ;测试
  9. (xsws 3.01) 2
  10. (xsws 3.00000000001) 11
  11. (xsws 3.00000000000001) 15
  12. (xsws 3.0000000000001) 13
  13. (xsws 3.000000000001) 16
  14. (xsws 3.000000000000001) 16
  15. (xsws 3.0000000000000001) 0
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-10-12 23:50:05 | 显示全部楼层
A real is a number containing a decimal point. Numbers between –1 and 1 must contain a leading zero. Real numbers are stored in double-precision floating-point format, providing at least 14 significant digits of precision. Note that VLISP does not show you all the significant digits.

Reals can be expressed in scientific notation, which has an optional e or E followed by the exponent of the number (for example, 0.0000041 is the same as 4.1e-6). Numbers such as 3.1, 0.23, –56.123, and 21,000,000.0 are valid AutoLISP reals.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-13 00:02:25 | 显示全部楼层
最初由 zxq0220 发布
[B]在ACAD中实数的小数位数一般精度是16位。我将楼主的程序改了一下,可测的位数多些,可是小数的位数大于12后就出错,返回值不对了。
[code]
(defun xsws (datt / ddn1 i)
(setq ddn1 datt i 0)
(while (> (- ddn1... [/B]

我就是发现当位数太多时会返回错误结果才在程序中加入>8位时取8位的判断语句的,不过这样处理还是有问题的,不一定是位数大于12才出错,刚才又测试了一下,如下面的小数还是不能返回正确结果:
$ (xsws 50.0002003)
8
_$
用改过的程序则返回15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

 楼主| 发表于 2005-10-13 10:15:15 | 显示全部楼层
最初由 eachy 发布
[B]你计算这个有什么意义?在哪方面应用? [/B]

有一个程序需要用rtos函数把计算结果比较精确地显示出来并用文字标在图上,标的时候要去掉小数有效位数后面的0,比如56.0004000应标成56.0004,所以需要计算小数位数作为rtos函数的参数使用。
我已经用另外一种算法基本解决了,子程序如下:
(defun xsws2 (datt / i)
  (setq i 14.0)
  (while (zerop (rem (fix (* datt (expt 10.0 i))) 10))
    (setq i (1- i))
        )
  (setq i i)
)

按斑竹的英文资料可以计算出14位小数以下(含14位),初步测试没什么问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 20:03 , Processed in 0.411967 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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