Comparing floating point numbers in C

后端 未结 4 1997
终归单人心
终归单人心 2020-11-29 10:03

I\'ve got a double that prints as 0.000000 and I\'m trying to compare it to 0.0f, unsuccessfully. Why is there a difference here? What

4条回答
  •  佛祖请我去吃肉
    2020-11-29 10:58

    Also, one often overlooked features of floating point number are the denormalized numbers. That's numbers which have the minimal exponent, yet don't fit in the 0.5-1 range.

    Those numbers are lower than FLT_MIN for float, and DBL_MIN for double.

    A common mistake with using a threshold is to compare two values, or use FLT_MIN/DBL_MIN as limit.

    For example, this would lead unlogical result (if you don't know about denormals):

    bool areDifferent(float a, float b) {
        if (a == b) return false;  // Or also: if ((a - b) == FLT_MIN) 
        return true;
    }
    
    
    // What is the output of areDifferent(val, val + FLT_MIN * 0.5f) ?
    // true, not false, even if adding half the "minimum value".
    

    Denormals also usually implies a performance loss in computation. Yet, you can not disable them, else such code could still produce a DIVIDE BY ZERO floating point exception (if enabled):

    float getInverse(float a, float b) {
        if (a != b)
            return 1.0f / (a-b); // With denormals disabled, a != b can be true, but (a - b) can still be denormals, it'll rounded to 0 and throw the exception
        return FLT_MAX;
    }
    

提交回复
热议问题