我现在做的三维建模工具,碰到实数精度导致的结果不正确问题。
用户输入的是实数长度,譬如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等等很成熟的软件是怎么处理实数的?
欢迎讨论,你的任何建议我都会仔细看。
解决方案 »
- visual studio 2012 项目属性 无法打开,弹出错误提示:未将对象的引用设置到对象的实例
- 四年磨一剑,开始找工作,散分108分开道
- 关于richedit嵌入对象,(其他容器嵌入对象也差不多吧)
- ●VC里面怎么使用System()执行isql命令啊?谢谢●
- 在线等待:我想让自己的程序运行到某处时等待几秒钟后继续,而且这段时间里不能太耗费cpu时间(sleep不行),怎么办?
- 我学程序不久,有点问题请教大家;先谢了
- 全局dll钩子中能不能同时设两个hook比如WH_MOUSE和WH_CALLWNDPROC?如果不行应该怎么办?
- 继承cwinthread 问题出现了
- VC6编译程序在超线程及双核机器下运行的问题
- JJ给了个难题,救救我!!!(急)
- RTP/RTCP如何得到当前媒体流的时间位置
- dialog滚动条设置问题
还有,这种情况下,也不能得到完全理论上的精度,这就要你自己在某些时候要取舍!
=====
这个貌似错了,懂意思就行了hoho~~