StartMe 发表于 2007-3-21 23:39:00

遇到一个关于运算结果的烦心问题

<p>我的目的:求一与一直线和一圆弧同时相切并相交的已知半径圆的圆心坐标。</p><p>我通过计算的出了圆心坐标,通过跟踪看出计算结果就是实际的位置,而且求得的圆在CAD下与已知线与圆弧操作Trim等命令都有效,说明没有错误。</p><p><font color="#ff0000">因为满足相切条件的圆可能有多个,我求出了所有满足半径及相切条件的所有圆,</font></p><p><font color="#ff0000">然后利用IntersectWith判断这些圆是否都与已知线与圆弧实际都相交,</font></p><p>但是IntersectWith得出的结论是不相交!导致求得实际应该为结果的圆心坐标并没成为计算结果。</p><p>这应该是浮点运算后产生的误差所致的吧。怎样才能使浮点运算后结果产生的误差最小?</p><p>或我的计算思路应该怎么改变?</p><p>求一能解决问题的方法。万分感谢!</p>

iq0050 发表于 2007-3-22 09:22:00

<p>利用浮点数运算不可避免的会产生误差.所以做浮点运算时不能用到"="号.而必须与一个极小数相比较,进行判断.</p><p>比如一个浮点数判断其是否为0.不能用</p><p>&nbsp;&nbsp;&nbsp; const PI=3.141592653589793</p><p>&nbsp;&nbsp;&nbsp; dim TestNum as double</p><p>&nbsp;&nbsp;&nbsp; testnum=sin(pi/4)</p><p>&nbsp;&nbsp;&nbsp; if testnum-sqr(2)/2=0 then</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........</p><p>&nbsp;&nbsp;&nbsp; end if</p><p>这时if语句的判断一定为假.而我们知道其该为真.解决方法是将0改为一极小值</p><p>&nbsp;&nbsp;&nbsp; const JudgeNum=0.0001</p><p>&nbsp;&nbsp;&nbsp; if abs(testnum-sqr(2)/2)&lt;judgenum then</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .................</p><p>&nbsp;&nbsp;&nbsp; endif</p><p>这是该语句的判断就为真了.</p><p>我想你遇到的该是这样的问题.</p>

StartMe 发表于 2007-3-22 23:08:00

<p>不是的。我知道这个问题。</p><p>我只是在计算过程没有进行取舍,我也没有用到判断语句,只是最后利用了<font color="#ff0000">IntersectWith</font><font color="#000000">进行了一下判断有没有交点而已。</font></p>

雪山飞狐_lzh 发表于 2007-3-23 10:46:00

<font color="#ff0000">IntersectWith在相切的时候不返回切点</font>

StartMe 发表于 2007-3-23 22:35:00

lzh741206发表于2007-3-23 10:46:00static/image/common/back.gifIntersectWith在相切的时候不返回切点

<p></p><p><font color="#ff0000"><font color="#000000">我没有用</font><font color="#ff0000">IntersectWith</font><font color="#000000">的结果,只是判断了一下其有没有值而已。</font></font></p><p><font color="#ff0000">IntersectWith</font>能判定是否相交,我用同样方法判断一与两直线同时相交且相切的圆时就可以的。但是换成一直线一圆时就不行了,而且是在判断与圆相交时出的问题。</p>
页: [1]
查看完整版本: 遇到一个关于运算结果的烦心问题