对了,对于浮点数的比较判断,尤其是等于的判断,只写==是很容易出错的,你最好写成这样的
if(abs(t-b)<0.00005)//这表示两者基本相等了。
这是由于浮点数运算的不准确性和存储方式造成的。

解决方案 »

  1.   

    还有这种情况?要是换成 if (t-b <= 0) 呢?
      

  2.   

    你这种比较方法是错误的,对于两个浮点数来讲,是不能用==来比较的,只能比较他们之间的误差小于多少比如上面的例子来讲,应该写成这样
     if(t-b<10E-n)(n为整数)
    {...................}
    保你不会出问题
      

  3.   

    Rabit9556 的语句里面,n 一般取 6。不过这种方法总有点...
      

  4.   

    我实际上是在做程序员杂志的本期编程擂台,在比较两个正方形左上角的点的tan值,从而判断两者之间是否是挡住视线,可是如果如Wingsun和Rabit9556所言,那么就会出现逻辑错误,各位怎么办?
      

  5.   

    如果t是同b相等,但由于误差使得t略大于b,你的判断条件就会漏过这个情况。所以你的判断条件除了前两个保留以外,再加上t减去b的值在误差范围内的条件,应该就可以了:
    if(t<b||t==b||t-b<minvalue)
    这个判断的实质就是通过减少精确度(t不比b大minvalue,就认为t和b相等),来解决浮点数不能判断相等的问题。
      

  6.   

    简单的处理方法:
    float t,b;
    if (t < b)
    {....}orif (t < b + e)
    {....}
    其中e是容许误差在你提供的例子里,实际的t一定略小于b.
      

  7.   

    //我不明白,以下程序会进入if
             float a,t;
    a=1.1;
    t=1.1;
    if(t<=a)AfxMessageBox("equal");
      

  8.   

    to wuchuncai:
    你说的这种情况当然能进去了,赋值都一样,在内存里面a和t一模一样,谁敢说它们不等。
    只是如果是通过计算得出的值,哪怕小数点后面十几位差了那么一丁点,也就不等了。没见到哪本书上说"=="不能用于浮点数比较的,只是由于浮点数本身的限制,要两个浮点数相等实在很难。所以通常在涉及到浮点数的计算时,都只是提出精确到10e-n这样的要求。
    if((fabs(t-b)<10e-10)这样写就差不多了。——还真没有见过其它方法。
      

  9.   

    我也曾经遇到过同样的问题,不过跟浮点数无关。char * pStart = ...;
    char * pEnd = ...;while( true )
    {
       if( pStart >= pEnd )  // 这里会出问题
          ...
    }我跟踪到 diasssembler window, 发现是 VC 生成的代码不对,是 jbe/jb 的问题,具体我记不清了。把 if( pStart >= pEnd ) 改成 if( (pStart > pEnd) || (pStart == pEnd) ) 后就没问题了。VC 的这bug可能在满足某种条件时会发生,比如在 while 循环中的 if 中。我用的是 vc6 + sp4