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

int を使用する場合と float を使用する場合の 2 つの結果の違いを見つけることができませんでした。

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代わりにそうです。したがって==、最後の比較では数値が等しいと見なされません。

これを解決するには、2 つの数値の差を小さいepsilon値と比較します。これfloat.hの定数を明示的に定義します。FLT_EPSILON

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