2011-10-13 100 views
0

我想比較浮點值以確定列表中的最大數字。float的精度是固定的,小數點後6位。比較C中的浮點值

我應該將它們作爲整數進行比較,如果它們相等,那麼去小數點後面的值?

+0

你究竟是什麼意思?「將它們比較爲整數,如果它們相等,那麼去小數點後面的數值」? – sth

+0

我的意思是首先比較它們使用「==」符號,如果它們仍然相同,則執行其他操作(不知道是什麼)。 – Harman

+0

如果它們相同,它們是相同的。那你還能做什麼? – glglgl

回答

0

這取決於你不告訴我們的東西。

  • 這些數字是如何提供給您的?作爲字符串,還是他們已經在內存中(浮點數組/雙數組)?
  • 它們有多大?爲了有一定的精度,有沒有最大的邊界?也就是說,如果數字爲1億,那麼是6位小數?
  • 可以失去精度嗎?

正如你在一個float數組中的值,我將做到以下幾點:

float biggest(float * values, int num) 
{ 
    int i; 
    float curmax; 
    if (num == 0) return NAN; 
    curmax = values[0]; 
    for (i=1; i < num; i++) { 
     if (values[i] > curmax) curmax = values[i]; 
    } 
    return curmax; 
} 
+0

數字在浮點數組中。 數字大多不大,但沒有指定用戶定義的最大邊界。小數點後6位始終相關。不,不要放鬆精度。 – Harman

+0

好的,因爲你有一個浮點數組,你可能已經失去了(不是精簡的)精度。在這種情況下,我只需定義一個變量並遍歷列表,每當發現一個大於變量的值時更新該變量。 – glglgl

0

如果你想找到的最大數量,你爲什麼會需要擔心關於比較平等?

+0

我的不好,我的意思是「<」 – Harman

+0

@哈曼,我不明白。你有浮點值作爲文本字符串?你上面的評論意味着什麼(「我的意思」是「'」)? – Kusalananda

2

比較花車的最簡單方法是使用<運營商,像這樣

if(float1 < float2) 
    printf("%f < %f\n", float1, float2); 
+0

用什麼精度<運算符比較兩個浮點值。 – Harman

+0

@哈曼浮點數是完全有序的。給定任意兩個非特殊數字a和b,下列情況中的一個是正確的,a b。不涉及公差。 –

+0

達到浮點值固有的精度。這大多是5到6位小數。 – glglgl

0

代碼來執行此如下所示:

float MinFloatArray(float *a, int n) 
{ 
    int i; 
    float result = MAX_FLOAT; 
    for (i=0; i<n; i++) 
     if (a[i]<result) 
      result = a[i]; 
    return result; 
} 
1

使用DBL_EPSILON以此爲基礎如何接近雙打需要。

使用FLT_EPSILON存在浮動。

請參閱this answer瞭解演示該技術的示例函數。

0

下面的文章提供了各種替代方案的比較浮點值.. http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

通常,發現浮標之間的差異,檢查如果差的精度範圍內,在比較花車幫助。 但也如上所述,對此沒有完美的答案和實施,因爲相鄰浮體之間的差異隨着幅度而變化。因此,如果您知道程序將使用的值的範圍,那麼您可以選擇適當的實現進行比較。