对于微控制器上的嵌入式SW应用程序,我必须为浮点数编写某种定制的除法运算符。我想使用的解决方案将在下面简短描述。
实际上,我不确定这种方法对于具有高性能要求的嵌入式应用程序的执行时间是否足够有效。
有人在处理浮点除以零的方法上有经验吗,这对于嵌入式应用程序是有效/优化的?
Updated Code:
data = ['A1', 'A14', 'B43', ...]
placeholders = ','.join('?' * len(data)) # this gives you e.g. '?,?,?'
sqlquery = 'SELECT * FROM table WHERE id IN (%s)' % placeholders
cur.execute(sqlquery, tuple(data))
答案 0 :(得分:2)
在大多数应用程序中,会有一些值,在该值以下,浮点数“可能也应为”零。例如,考虑如下内容:
float intensity(float dx, float dy)
{
float result = 1/(dx*dx + dy*dy);
if (result > 65535.0f) result = 65535.0f;
return result;
}
如果除数小于1 / 65535.0f,则在距离不完全为零的情况下,无论除数的实际值如何,函数都应返回65535.0f,即使这种行为可能也会有用。是零。因此,该函数可以重写为:
float intensity(float dx, float dy)
{
float distSq = dx*dx + dy*dy;
if (distSq <= (1.0f/65535.0f))
return 65535.0;
else
return 1/distSq;
}
请注意,此类代码的特殊情况处理可能会非常不完美。尽管对于65535.0f来说不是特别的问题,但在某些情况下,distSq
恰好等于最大值的倒数,但其倒数小于最大值。例如,如果最大值为46470.0f,而distSq
为0.0000215238924f,则正确的结果将为46459.9961f,但函数将返回46470.0f。这样的问题在实践中不太可能带来问题,但是应该意识到这些问题。请注意,如果比较使用的是小于等于而不是等于等于,并且最大值为46590.0f,则distSq
值0.0000214642932f将产生结果46589.0039,该值超过最大值。
答案 1 :(得分:1)
它不快,但可能慢得多。它必须将浮点数移动到整数寄存器(可以通过将其写入内存并读回)来执行整数运算。只需执行== 0.0f
即可完成浮点比较,这是最有效的方法。
如果您希望它具有“高性能”,请尝试以下操作:
float div_float(float a, float b)
{
b = b == 0.0f ? 1.0f : b;
return a / b;
}
这可以优化为一些没有分支的简单指令,并且由于任何分支都会降低性能,因此总体上要快得多。这在图形驱动程序中使用,如果用户提供的垃圾数据最终将导致被零除,那么结果已经是无效的,但是不希望引发浮点异常。