fly_902 发表于 2007-9-3 16:31:00

[讨论]由字符串转换实数的精度

<p>一般来说, 由字符串形式转换实数时有以下几种方法</p><p>(示例:(setq&nbsp; str “4527323.58457”)&nbsp;我们需要将Str转换成实数形式4527323.58</p><p>&nbsp;1、采用转换函数(atof&nbsp;&nbsp;str&nbsp;)得到实数形式,但精度不行,得到的仅仅是以科学计数法表示的数据(4.52732e+006),这在工程上是不匀许的,误差有点大</p><p>2、read 函数有点意思,仅能读到整数部位</p><p>3、atoi 函数是转换整数的(忽略)</p><p>不知大家有没有办法使转换时,误差小一些?</p>

c3a139 发表于 2007-9-3 16:58:00

(setq aa (rtos (atof "4527323.58457") 2 2))

fly_902 发表于 2007-9-3 17:36:00

c3a139发表于2007-9-3 16:58:00static/image/common/back.gif(setq aa (rtos (atof \"4527323.58457\") 2 2))

<p></p>这样不又成字符串形式了吗?&nbsp; 还是无法操作数据!

无痕 发表于 2007-9-3 20:17:00

<p>(setq aa (rtos (atof "4527323.58457") 2 4))</p><p>说明(atof&nbsp;&nbsp;str&nbsp;)精度并没有丢失,只是cad没有显示全而已。</p>

fly_902 发表于 2007-9-3 21:06:00

无痕发表于2007-9-3 20:17:00static/image/common/back.gif(setq aa (rtos (atof \"4527323.58457\") 2 4))说明(atof&nbsp;&nbsp;str&nbsp;)精度并没有丢失,只是cad没有显示全而已。

<p></p><p>&nbsp;&nbsp;&nbsp;&nbsp; 我跟踪调试了一次,&nbsp;&nbsp; (setq aa (rtos (atof "4527323.58457") 2 4))是没有错的, 但并不能说明转换后的实数 f&nbsp;就等于&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4527323.58457,况且很多程序都有存储字节大小的问题, 但像C++中的Double 类型就可以达到工程所需要的精度问题, Lisp的存储精度没有那么高, 我的意思有没有一种办法可以存储成一种精度相对较高的数据类型??? </p><p>atof&nbsp; 这个转换函数转换的精度不够, 跟踪调试过程仅能显示出小数点后边两位, 位数高的时候以科学计数法存储[在工程上不允许], 建议版主调试一下!!</p>

无痕 发表于 2007-9-3 22:27:00

<p>你被cad的显示蒙蔽了双眼</p><p>cad的精度可以做到小数点后大概10位(记不太清楚了),足够用了。</p><p>科学记数法也只是显示用的,数还是那个数,你就直接存取atof或distof那个数就可以了</p>

fly_902 发表于 2007-9-10 18:09:00

本帖最后由 作者 于 2007-9-10 19:32:20 编辑 <br /><br /> <p>较小的数的转换:</p><p>_1_$ (atof "5.234")<br/>5.234</p><p>较大的数的转换<br/>_1_$ (atof "12453678.467537")<br/>1.24537e+007</p><p>中间的数的转换<br/>_1_$ (atof "499252.10389")<br/>499252.0</p><p>不用中间变量的转换<br/><br/>_1_$ (rtos (atof "499252.10389") 2 5)<br/>"499252.10389"</p><p>直接将较大的数赋值给参数a<br/>_1_$ (setq a 499252.12345)<br/>499252.0<br/>_1_$ </p><p>&nbsp;直接将较小的数赋值给参数a<br/>_$ (setq a 2.12345455)<br/>2.12345</p><p>通过以上对比, 版主的话不敢苟同,希望大家想出一个通用的法子,将较大的数的精度增大!</p><p></p><p></p><p>&nbsp;</p>

无痕 发表于 2007-9-10 22:55:00

本帖最后由 作者 于 2007-9-10 22:58:25 编辑 <br /><br /> <p>较大的数的转换<br/>_1_$ (atof "12453678.467537")<br/>1.24537e+007<br/>答复:(rtos (atof "12453678.467537") 2 6) = "12453678.467537" </p><p>中间的数的转换<br/>_1_$ (atof "499252.10389")<br/>499252.0<br/>答复:(rtos (atof "499252.10389") 2 6) = "499252.103890"&nbsp; </p><p>不用中间变量的转换</p><p><br/>直接将较大的数赋值给参数a<br/>_1_$ (setq a 499252.12345)<br/>499252.0<br/>答复:(rtos (setq a 499252.12345) 2 6) = "499252.123450"&nbsp;&nbsp; <br/>_1_$ </p><p>&nbsp;直接将较小的数赋值给参数a<br/>_$ (setq a 2.12345455)<br/>2.12345<br/>答复:(rtos (setq a 2.12345455) 2 8) = "2.12345455"</p><p>再来:</p><p>(setq a 49925200000.12345)<br/>_$ </p><p>4.99252e+010 </p><p>(rtos(setq a 49925200000.12345)2 8) = "49925200000.12345" </p><p></p><p>可见 a 的精度并没有丢失,只是cad在显示的时候仅仅显示为</p><p>499252.0&nbsp; 2.12345&nbsp; 4.99252e+010 </p><p>还是那句话,cad的显示蒙蔽了你的双眼,数据的精度没有丢失 </p><p>但是转化为字符,截去小数点后位数,那才是真正的丢失精度<br/></p>

ZZXXQQ 发表于 2007-9-10 22:58:00

<p>可以试着将LUPREC设得大些,但不能大于8。</p><p>计算机内部存贮数据是用二进制,而二进制在表示小数时存在误差,可以从二/十进制转换的公式看出。</p><p>ACAD内部所用的浮点数的有效位数可达16位(可以从DXFOUT命令中保存精度看出),做一般的计算足够用了。即使是显示不出来有效的小数位也不影响计算结果。</p><p>为提高计算精度,注意不要用太小的数做分母。</p>

czcxxx 发表于 2015-10-24 16:20:39

页: [1] 2
查看完整版本: [讨论]由字符串转换实数的精度