C 将分数转换为浮点
我正在尝试将分数转换为浮点,并将其用于比较。 但是值太小,对于布尔变量的结果,它返回true。我的换算正确吗?或者我应该用另一种我不知道的方式来做 测试用例: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
// 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.8f bool 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。请您对其稍加注释,我仍然不了解逻辑。所以你得到了因子的上限和下限,然后你怎么办?@Andrelimitp
和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);