明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6248|回复: 10

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

[复制链接]
发表于 2007-9-3 16:31:00 | 显示全部楼层 |阅读模式

一般来说, 由字符串形式转换实数时有以下几种方法

(示例:(setq  str “4527323.58457”) 我们需要将Str转换成实数形式4527323.58

 1、采用转换函数(atof  str )得到实数形式,但精度不行,得到的仅仅是以科学计数法表示的数据(4.52732e+006),这在工程上是不匀许的,误差有点大

2、read 函数有点意思,仅能读到整数部位

3、atoi 函数是转换整数的(忽略)

不知大家有没有办法使转换时,误差小一些?

发表于 2007-9-3 16:58:00 | 显示全部楼层
(setq aa (rtos (atof "4527323.58457") 2 2))
 楼主| 发表于 2007-9-3 17:36:00 | 显示全部楼层
c3a139发表于2007-9-3 16:58:00(setq aa (rtos (atof \"4527323.58457\") 2 2))

这样不又成字符串形式了吗?  还是无法操作数据!
发表于 2007-9-3 20:17:00 | 显示全部楼层

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

说明(atof  str )精度并没有丢失,只是cad没有显示全而已。

 楼主| 发表于 2007-9-3 21:06:00 | 显示全部楼层
无痕发表于2007-9-3 20:17:00(setq aa (rtos (atof \"4527323.58457\") 2 4))说明(atof  str )精度并没有丢失,只是cad没有显示全而已。

     我跟踪调试了一次,   (setq aa (rtos (atof "4527323.58457") 2 4))是没有错的, 但并不能说明转换后的实数 f 就等于      4527323.58457,况且很多程序都有存储字节大小的问题, 但像C++中的Double 类型就可以达到工程所需要的精度问题, Lisp的存储精度没有那么高, 我的意思有没有一种办法可以存储成一种精度相对较高的数据类型???

atof  这个转换函数转换的精度不够, 跟踪调试过程仅能显示出小数点后边两位, 位数高的时候以科学计数法存储[在工程上不允许], 建议版主调试一下!!

发表于 2007-9-3 22:27:00 | 显示全部楼层

你被cad的显示蒙蔽了双眼

cad的精度可以做到小数点后大概10位(记不太清楚了),足够用了。

科学记数法也只是显示用的,数还是那个数,你就直接存取atof或distof那个数就可以了

 楼主| 发表于 2007-9-10 18:09:00 | 显示全部楼层
本帖最后由 作者 于 2007-9-10 19:32:20 编辑

较小的数的转换:

_1_$ (atof "5.234")
5.234

较大的数的转换
_1_$ (atof "12453678.467537")
1.24537e+007

中间的数的转换
_1_$ (atof "499252.10389")
499252.0

不用中间变量的转换

_1_$ (rtos (atof "499252.10389") 2 5)
"499252.10389"

直接将较大的数赋值给参数a
_1_$ (setq a 499252.12345)
499252.0
_1_$

 直接将较小的数赋值给参数a
_$ (setq a 2.12345455)
2.12345

通过以上对比, 版主的话不敢苟同,希望大家想出一个通用的法子,将较大的数的精度增大!

 

发表于 2007-9-10 22:55:00 | 显示全部楼层
本帖最后由 作者 于 2007-9-10 22:58:25 编辑

较大的数的转换
_1_$ (atof "12453678.467537")
1.24537e+007
答复:(rtos (atof "12453678.467537") 2 6) = "12453678.467537"

中间的数的转换
_1_$ (atof "499252.10389")
499252.0
答复:(rtos (atof "499252.10389") 2 6) = "499252.103890" 

不用中间变量的转换


直接将较大的数赋值给参数a
_1_$ (setq a 499252.12345)
499252.0
答复:(rtos (setq a 499252.12345) 2 6) = "499252.123450"  
_1_$

 直接将较小的数赋值给参数a
_$ (setq a 2.12345455)
2.12345
答复:(rtos (setq a 2.12345455) 2 8) = "2.12345455"

再来:

(setq a 49925200000.12345)
_$

4.99252e+010

(rtos(setq a 49925200000.12345)2 8) = "49925200000.12345"

可见 a 的精度并没有丢失,只是cad在显示的时候仅仅显示为

499252.0  2.12345  4.99252e+010

还是那句话,cad的显示蒙蔽了你的双眼,数据的精度没有丢失

但是转化为字符,截去小数点后位数,那才是真正的丢失精度

发表于 2007-9-10 22:58:00 | 显示全部楼层

可以试着将LUPREC设得大些,但不能大于8。

计算机内部存贮数据是用二进制,而二进制在表示小数时存在误差,可以从二/十进制转换的公式看出。

ACAD内部所用的浮点数的有效位数可达16位(可以从DXFOUT命令中保存精度看出),做一般的计算足够用了。即使是显示不出来有效的小数位也不影响计算结果。

为提高计算精度,注意不要用太小的数做分母。

发表于 2015-10-24 16:20:39 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-21 00:52 , Processed in 0.200163 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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