我现在做的三维建模工具,碰到实数精度导致的结果不正确问题。
用户输入的是实数长度,譬如1.99999微米,那么我会设置一个精度譬如0.001,然后把用户的输入值*1000+0.5变成一个int来处理,而且每增加一个实数点,我都会判断这个实数转换成int后是不是与前面哪个点相同,但实际使用的时候还是有精度误差导致问题,譬如一个线段从0开始,1结束,我现在把它切成三段,有两种方法:
(1) 我先求出每段长度,
l=(int)(1/3.0*1000+0.5)=333,
然后每段长度就是左边点+l,得到三段为[0,333],[333,666][666,999]
那么导致999与右边不再匹配,这样就出现了错误。
(2) 如果我直接求线段左右点位置,譬如中间第二点为
(int)(2/3.0*1000+0.5) = 667,
此时求出的线段就匹配了。
这个例子我是知道的很清楚所以能保证得到准确的值,但有其他很多情况都出现这种类似的问题。
我就想问一下像solidworks,Pro/E,UG,AutoCAD等等很成熟的软件是怎么处理实数的?
欢迎讨论,你的任何建议我都会仔细看。
用户输入的是实数长度,譬如1.99999微米,那么我会设置一个精度譬如0.001,然后把用户的输入值*1000+0.5变成一个int来处理,而且每增加一个实数点,我都会判断这个实数转换成int后是不是与前面哪个点相同,但实际使用的时候还是有精度误差导致问题,譬如一个线段从0开始,1结束,我现在把它切成三段,有两种方法:
(1) 我先求出每段长度,
l=(int)(1/3.0*1000+0.5)=333,
然后每段长度就是左边点+l,得到三段为[0,333],[333,666][666,999]
那么导致999与右边不再匹配,这样就出现了错误。
(2) 如果我直接求线段左右点位置,譬如中间第二点为
(int)(2/3.0*1000+0.5) = 667,
此时求出的线段就匹配了。
这个例子我是知道的很清楚所以能保证得到准确的值,但有其他很多情况都出现这种类似的问题。
我就想问一下像solidworks,Pro/E,UG,AutoCAD等等很成熟的软件是怎么处理实数的?
欢迎讨论,你的任何建议我都会仔细看。
解决方案 »
- 关于使用GetExtendedUdpTable获取UDP连接信息
- CDocument::UpdateAllViews怎么使用啊?
- 请问为什么使用socket发送的信息无法使用sniffer抓住
- 如何得到指向主对话框指针?在线等....
- 采用拉模式的sourcefilter例子制作播放器,加载大媒体文件需要很长的等待时间解决办法!!!!
- 关于定时器?
- 关于线程池的函数在WINBASE.H中找不到.
- 对于一个CTypedPtrList来说,new一个对象是不是有必要?
- regsvr32注册DLL(OCX)出错的问题。
- 百分求解:如何在系统级上将IPX数据包转成TCP/IP包
- RTP/RTCP如何得到当前媒体流的时间位置
- dialog滚动条设置问题
还有,这种情况下,也不能得到完全理论上的精度,这就要你自己在某些时候要取舍!
=====
这个貌似错了,懂意思就行了hoho~~