2014-01-07 4 views
0

Я даже не знаю, как назвать эту проблему, так что первый я представлю некоторый код:C без знака долго долго просчет

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; 

Это показывает «ОК» после сравнения так TEMP1 и температуры равны (это то, к чему я стремился), но по переменной я получаю разные результаты в result->values[indexes[i]], с temp и temp1. Результаты temp1 являются правильными, но мне нужно, чтобы temp был гибким.

Я использую GCC с затмением в Windows. Любая идея, как это решить?

Edit: printf("%llu\n", temp); и printf("%llu\n", temp1); как возвращение 65535 ...

+0

Как распределяется «результат»? Любой шанс, что вы сбиваете память и перезаписываете «temp»? – FatalError

+2

@mlodziaszka Что такое 'range'? – imp25

+0

struct dcd72f <- this struct is result { \t unsigned long long values ​​[72];/** mlodziaszka

ответ

-1

Вы никогда не сравнить два поплавка в состоянии. Реальные числа в диапазоне бесконечны, но float-double - нет. Он имеет бесконечные пробелы, и они дают вам приблизительное значение. Компаратор == - двоичный. Это должна быть ваша проблема.

+1

Где вы видели данные с плавающей запятой в вопросе? – harper

Смежные вопросы