-2

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

这是我的代码:

#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;
}

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

4

1 回答 1

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.33331.0数学上是这样,但在使用浮点算术时却不是——0.99999而是相反。因此==,在最后一次比较中不将数字视为相等。

为了解决这个问题,将两个数字的差异与一个小epsilon值进行比较。为此float.h明确定义常量:FLT_EPSILON

if (fabs(array[i] - num) < FLT_EPSILON) { ...
于 2013-05-10T07:49:41.047 回答