C 将分数转换为浮点

C 将分数转换为浮点,c,embedded,blackfin,C,Embedded,Blackfin,我正在尝试将分数转换为浮点,并将其用于比较。 但是值太小,对于布尔变量的结果,它返回true。我的换算正确吗?或者我应该用另一种我不知道的方式来做 测试用例: // result is -0.0074 float coilh0re = fr32_to_float(GO_coil_H[0].re)*0.8f; // result is -0.0092 float coilrefundamental = fr32_to_float(CoilEepromData.coilboardhs

我正在尝试将分数转换为浮点,并将其用于比较。 但是值太小,对于布尔变量的结果,它返回true。我的换算正确吗?或者我应该用另一种我不知道的方式来做

测试用例:

  // result is -0.0074
  float coilh0re = fr32_to_float(GO_coil_H[0].re)*0.8f;
  // result is -0.0092
  float coilrefundamental = fr32_to_float(CoilEepromData.coilboardhspule.reFundamental);
  // result is -0.01123
  float coilh0re2 = fr32_to_float(GO_coil_H[0].re)*1.2f;
  -0.0074>-0.0092> -0.01123
这是一段代码片段

       bool resultA  = fr32_to_float(GO_coil_H[0].re)*0.8f < fr32_to_float(CoilEepromData.coilboardhspule.reFundamental)  ? 1 : 0;
       bool resultB  = fr32_to_float(CoilEepromData.coilboardhspule.reFundamental)  <= fr32_to_float(GO_coil_H[0].re)*1.2f ? 1 : 0;

       bool resultAB = !(resultA & resultB); // always true

       bool resultC  =  fr32_to_float(GO_coil_H[1].re)*0.8f < fr32_to_float(CoilEepromData.coilboardhspule.reHarmonic) ? 1:0;
       bool resultD  = fr32_to_float(CoilEepromData.coilboardhspule.reHarmonic)  <= fr32_to_float(GO_coil_H[1].re)*1.2f ? 1:0;

       bool resultCD = !(resultC & resultD); // always true

       bool resultE  =  fr32_to_float(GO_coil_H[0].im)*0.8f < fr32_to_float(CoilEepromData.coilboardhspule.imFundamental)? 1 : 0;
       bool resultF  =  fr32_to_float(CoilEepromData.coilboardhspule.imFundamental) <= fr32_to_float(GO_coil_H[0].im)*1.2f ? 1 : 0;

       bool resultEF = !(resultE & resultF);// always true

       bool resultG  =  fr32_to_float(GO_coil_H[1].im)*0.8f < CoilEepromData.coilboardhspule.imHarmonic ? 1 : 0;
       bool resultH  =  fr32_to_float(CoilEepromData.coilboardhspule.imHarmonic) <= fr32_to_float(GO_coil_H[1].im)*1.2f ? 1 : 0;

       bool resultGH = !(resultG & resultH);// always true

        if(! ((fr32_to_float(GO_coil_H[0].re)*0.8f < fr32_to_float(CoilEepromData.coilboardhspule.reFundamental)) && (fr32_to_float(CoilEepromData.coilboardhspule.reFundamental) <= fr32_to_float(GO_coil_H[0].re)*1.2f) ) 
        || ! ((fr32_to_float(GO_coil_H[1].re)*0.8f < fr32_to_float(CoilEepromData.coilboardhspule.reHarmonic))    && (fr32_to_float(CoilEepromData.coilboardhspule.reHarmonic) <= fr32_to_float(GO_coil_H[1].re)*1.2f)    )
        || ! ((fr32_to_float(GO_coil_H[0].im)*0.8f < fr32_to_float(CoilEepromData.coilboardhspule.imFundamental)) && (fr32_to_float(CoilEepromData.coilboardhspule.imFundamental) <= fr32_to_float(GO_coil_H[0].im)*1.2f) )
        || ! ((fr32_to_float(GO_coil_H[1].im)*0.8f < fr32_to_float(CoilEepromData.coilboardhspule.imHarmonic))    && (fr32_to_float(CoilEepromData.coilboardhspule.imHarmonic) <= fr32_to_float(GO_coil_H[1].im)*1.2f)    ) )

        {
            eUserCode           = E_USER_SOIL_FAILED;
            eProcessState       = E_ERROR_HANDLING;  
        }

}
bool resultA=fr32\u to\u float(GO\u coil\u H[0].re)*0.8fbool resultB=fr32_to_float(CoilEepromData.coilboardshpule.returnamental)如果要比较分数,请不要使用浮点。将它们转换为相同的分母并比较分子。

如果出现,OP希望测试值
退款
是否在
re
的+/-20%范围内。这不是一个
float
精度问题,而是一个数学问题

// Simplified problem
float re = -0.01123f/1.2f;
float reFundamental = -0.0092f;
bool resultA  = re*0.8f < reFundamental;
bool resultB  = reFundamental <= re*1.2f;
bool resultAB = !(resultA & resultB); // always true
//简化问题
浮点数re=-0.01123f/1.2f;
浮动退款额=-0.0092f;
bool resultA=re*0.8f<0.8f;

bool resultB=为什么要否定我的问题?我提供了一个示例,其中包含了一段代码,您的“测试用例”包含了一些使用我们不知道的参数对未知函数的函数调用。这就像在问:为什么这个代码不起作用:
x=foo(bar)
?@pmg上下文很重要。有人会说恰恰相反。考虑到你在过去几天里发布的问题,这个项目看起来对你目前的知识来说太具有挑战性了。与其利用我们来完成你的工作,为什么不先让你自己掌握基本知识呢?代码:如果您永久地将float转换为frac并返回,那么在整个代码中使用float将更容易、更快。使用分数的原因通常是为了避免使用浮点。@pmg:根据必要的精度,
float
就足够了。特别是在嵌入式系统上(这两种类型通常使用相同的表示法)。你能举个例子吗?我不知道如何将它们转换成相同的分母?最简单的方法是将分数a与分母b相乘,反之亦然。这给出了公分母。然后您可以比较这些分子。@Andre应该会有帮助。@merl分数32的范围是-1,1。如果我想乘以fract32a*1.2,我会写一个*10。那么把A和12比较一下?对的但是A*10会溢出fract32@Andre我不熟悉您的数据类型,这只是概念。您应该阅读关于比较Serhio链接的分数的wiki页面。如果您没有找到更好的方法来比较分数,您可能需要更改您的数据类型或使用其他临时数据类型进行比较。@您是否忘记将1.0d改为1.0f?@Andre Code fixed。请您对其稍加注释,我仍然不了解逻辑。所以你得到了因子的上限和下限,然后你怎么办?@Andre
limitp
limitm
不是上限和下限
limitm
的震级限值较小(接近0.0),而
limitp
的震级限值较大。如果
x>limitm
,那么
x在
float
和分数之间来回转换是完全没有意义的。我想知道为什么OP使用定点DSP,如果他使用(软件)浮点。手臂皮质M4F会更快。
bool in_range(float x, float limit, float factor) {
  float limitp = limit*(1.0f + factor);
  float limitm = limit*(1.0f - factor);

  if (x > limitm) return x <= limitp;
  if (x < limitm) return x >= limitp;
  return x == limitp;
}

bool resultAB = !in_range(fr32_to_float(CoilEepromData.coilboardhspule.reFundamental),   
    fr32_to_float(GO_coil_H[0].re), 0.20);