2014-01-07 30 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