结果通用函数中int和float的区别

时间:2013-05-10 07:30:29

标签: c++

编译并运行我的代码;如果您使用带有小数值的整数或浮点数,则比较结果。为什么会有区别?

这是我的代码:

#include <iostream>
using namespace std;

template<class T>

T find(T array[], T len, T num){    
    for (int i = 0; i < len; ++i){
        if (array[i] == num) 
             return i;
    }
    return -1;
}

int main () {  
    int array1[5] = { 4, 7, 3, 5, 6 }, num1;
    float array2[5] ={121.2, 111.5, 300.1, 500.1, 600.1 }, num2;

    cout << "Enter an int:" << " " ;
    cin >> num1;

    cout << "Enter a float:" << " " ;
    cin >> num2;        

    int x = find<int>(array1,5,num1);
    float y= find<float>(array2,5,num2); 

    cout << "The index for the int is:" << "  " << x << endl;         
    cout << "The index for the float is:" << "  " << y << endl;

    return 0;
}

使用整数和使用浮点数时,我找不到两个结果之间的区别。

1 个答案:

答案 0 :(得分:4)

问题是由于浮点数的内部表示,您不能将浮点数与==进行比较。如果您正在使用表达式的结果,则在数学上找到数组中的数字是正确的,但由于浮点表示的限制,==将无法找到它。

请考虑以下代码:

template<class T>
int find(T array[], size_t len, T num){    
    for (size_t i = 0; i < len; ++i){
        cerr << std::setprecision(7) << "Compare: " << array[i] << ", " << num;
        if (array[i] == num) {
             cerr << " => equal" << endl;
             return i;
        } else {
             cerr << " =>not equal" << endl;
        }
    }
    return -1;
}


int main () {  
    float array2[2] ={500.1, 1.0 }, num2;

    float a = 500.1 / 2;
    int i = find<float>(array2, 2, 2*a); 

    a = 1.0 / 0.3333;
    i = find<float>(array2, 2,  a * 0.3333); 

    return 0;
}

输出:

Compare: 500.1, 500.1 => equal
Compare: 500.1, 0.9999999 =>not equal
Compare: 1, 0.9999999 =>not equal

所以,即使1.0 / 0.3333 * 0.3333在数学上是1.0,也不是在使用浮点算术时 - 而是0.99999。因此,==并未将数字视为上次比较中的数字。

要解决此问题,请将两个数字的差异与较小的epsilon值进行比较。 float.h为此显式定义了常量FLT_EPSILON

if (fabs(array[i] - num) < FLT_EPSILON) { ...