2013-05-10 56 views
-2

編譯並運行我的代碼;如果您使用整數或浮點數與小數值比較結果。爲什麼有差異?結果泛型函數中int和float之間的差異

這裏是我的代碼:

#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和使用浮點數時,當我找不到這兩個結果之間的差異。

+2

爲什麼LEN爲T?應該是size_t ... 而返回類型是一個索引,所以它也應該是不同的.. ptrdiff_t,我會說,或者int如果你不喜歡ptrdiff_t – 2013-05-10 07:33:48

+0

你是什麼意思「有什麼區別」? – 2013-05-10 07:35:49

+0

另外,你會期望什麼區別?模板函數,一旦你調整長度和索引類型的類型,應該適用於定義了operator ==的任何數據類型... – 2013-05-10 07:36:58

回答

3

問題是由於浮點數的內部表示,您不能將浮點數與==進行比較。如果使用表達式的結果,則在數組中找到數字是正確的,但由於浮點表示法的限制,==找不到它。

考慮下面的代碼:

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) { ... 
+0

所以我應該比較浮動與? – user2364471 2013-05-10 07:51:49

+0

但在我的情況下,它仍然可以找到數字。嘗試編譯和運行我的代碼,並搜索數組中的任何浮點數。你會找回那個號碼的索引。 – user2364471 2013-05-10 08:00:29

+0

@ user2364471是的,這取決於實際的數字以及它是如何計算的。看到我的代碼,'1.0/0.3333 * 0.3333'在數學上是1.0,並且cerr也是這樣打印的,但是'=='將它們視爲不同的 – 2013-05-10 08:02:39

相關問題