2014-01-07 31 views
0

我甚至不知道如何命名這個問題,所以首先我將介紹一些代碼:ç無符號很長很長的失算

void hsvm2dcd72f(const hsvm_t *src, dcd72f_t *result, unsigned long long range) 
{ 
    int h, s, v; 
    int kh, ks, kv; 
    int i; 
    int indexes[72]; 
    int values[72]; 
    unsigned long long sum = 0; 
    unsigned long long temp = 0; 

    for (i = 0; i < 72; i++) 
    { 
     result->values[i] = 0; 
     values[i] = 0; 
    } 

    for (i = 0; i < src->length; i++) 
    { 

     h = (int) src->content[i].h; 
     s = (int) src->content[i].s; 
     v = (int) src->content[i].v; 

     // kwantyzacja H 
     if ((h >= 316) || (h < 20)) 
      kh = 0; 
     else if ((h >= 20) && (h < 40)) 
      kh = 1; 
     else if ((h >= 40) && (h < 75)) 
      kh = 2; 
     else if ((h >= 75) && (h < 155)) 
      kh = 3; 
     else if ((h >= 155) && (h < 190)) 
      kh = 4; 
     else if ((h >= 190) && (h < 270)) 
      kh = 5; 
     else if ((h >= 270) && (h < 295)) 
      kh = 6; 
     else if ((h >= 295) && (h < 316)) 
      kh = 7; 

     // kwantyzacja S 
     if ((s >= 0) && (s <= 20)) 
      ks = 0; 
     if ((s > 20) && (s <= 70)) 
      ks = 1; 
     if ((s > 70) && (s <= 100)) 
      ks = 2; 

     //kwantyzacja V 
     if ((v >= 0) && (v <= 20)) 
      kv = 0; 
     if ((v > 20) && (v <= 70)) 
      kv = 1; 
     if ((v > 70) && (v <= 100)) 
      kv = 2; 

     values[9 * kh + 3 * ks + kv]++; 
    } 

    quicksorti((int*) &indexes, (int*) &values, 72); 

    //norm 
    for (i = 72 - 8; i < 72; i++) 
     sum += (unsigned long long) values[indexes[i]]; 

    unsigned long long temp1 = 65535; 
    temp = (unsigned long long) range; 
    if(temp == temp1) 
     printf("ok"); 
    for (i = 72 - 8; i < 72; i++) 
    { 
     result->values[indexes[i]] = values[indexes[i]]*temp1/sum; 
    } 
} 

struct dcd72f // result struct 
{ 
    unsigned long long values[72]; /**< dcd descriptor values. */ 
}; 
typedef struct dcd72f dcd72f_t; 

它顯示「OK」的比較後使temp1中和溫度相等(這是我的目標),但根據變量,我得到不同的結果result->values[indexes[i]]temptemp1temp1結果是正確的,但我需要temp是靈活的。

我在Windows上使用GCC和eclipse。任何想法如何解決這個問題?

編輯: printf("%llu\n", temp);printf("%llu\n", temp1);都返回65535 ...

+0

如何分配結果?你有沒有機會破壞一些內存並覆蓋'temp'? – FatalError

+2

@mlodziaszka什麼是'範圍'? – imp25

+0

struct dcd72f < - 此結構爲結果 { \t unsigned long long values [72];/** mlodziaszka

回答

-1

你從來沒有在一個條件比較兩個浮動。一個範圍內的實數是無限的,但是浮點數不是。它有無限的空白,並給你一個近似的價值。比較器==是二進制級別的。這一定是你的問題。

+1

你在哪裏看到問題中的任何浮點數據? – harper