比较最小值/最大值的浮点数(浮点数或双精度数)

时间:2017-03-31 02:50:54

标签: c++ floating-point precision floating-accuracy

如何比较两种不同的浮子,达到一定的准确度。我知道在任何编程语言中使用浮点数或双精度时存在非常轻微的不精确性,但是这可能足以导致浮点数<a href="{{ object.get_absolute_url }}">{{ object.name }}</a> 的这种比较返回与实际应该不同的值。

我正在解决UVa Online Judge的一个问题,这个问题多次给我一个错误的答案。它使用了几个浮点值作为输入,虽然是2位小数。我想出了临时解决方案,即通过拆分输入并将其转换为整数,但我不想总是使用它。

所以我的问题是,如果a和b的输入被赋予正确的n个小数位,那么比较float a是小于(或大于)float b的最佳方法是什么?这种情况,2?

我更喜欢的语言是C ++。

4 个答案:

答案 0 :(得分:0)

使用std::numeric_limits<T>::epsilon()检查两个数字是否几乎相等。如果你想知道一个是更大/更小,你还应该考虑相对容差。

#include <cmath>
#include <limits>

template < typename T >
bool fuzzy_compare(T a, T b)
{
  return std::abs(a - b) < std::numeric_limits<T>::epsilon();
};

答案 1 :(得分:0)

使用数学:

#define PREC 0.01                 //(1/pow(10,n)), n = 2
float c = a-b;
if (abs(c) < PREC) {
    printf("a equals b");
} else if(c < 0){
    printf("b is grater than a");
} else 
    printf("a is grater than b");
}

答案 2 :(得分:0)

使用setprecison()运算符。您在括号之间放入的数字将决定通过小数的数字将包含在输出中。一定要包含iomanip库。

答案 3 :(得分:0)

比较花车总是很棘手这是一个更复杂的例子,说明你应该使用std::numeric_limits<T>::epsilon()的原因。

  • 第一行返回true,但第二行返回false(在我的机器上)。

    float64_t CalculateEpsilon ()
    {
        float64_t l_AllowedInaccuray = 1; // 1.1, 0.9
        int32_t significantDecimalPlaces = 2;
    
        return ( l_AllowedInaccuray * pow ( 0.1, significantDecimalPlaces ) );
    }
    
    bool IsEqual ( float64_t lhs, float64_t rhs )
    {
        float64_t l_Epsilon = CalculateEpsilon ();
    
        float64_t l_Delta = std::abs ( lhs - rhs );
        return l_Delta <= l_Epsilon;
    }
    
    int32_t main ()
    {
        std::cout << IsEqual ( 107.35999999999999, 107.350 );  //returns true
        std::cout << IsEqual ( 107.359999999999999, 107.350 ); //returns false
    
        return 0;
    }