整数模拟浮点数运算小技巧

    数学背景:t1 = 222406138240, t1' = 221398198824, t2 = 769162154708, t2' = 768154292671(单位:ns);

                        k = (t1 - t1')/(t2 - t2'); 所需的结果为tr/k - tr,取整数部分, 其中tr为数量级为1 * e4数量级的一个时间值。

    应用背景:嵌入式linux环境,内核态,CPU为powerPC.

    问题:由于powerPC不支持浮点数运算,或者编译器不支持浮点数运算,或者没有加载特定的函数库,导致不能计算出比值K.

    分析:考虑运用整数采用特殊技巧达到浮点数运算效果。

    首先想到的是在分子中乘以一个1*en, n为k需要取的浮点数的小数点有效位数。但这样的话分子将必须用64位长整型表示,由于在内核态,不支持64位除法,所以这种方          法行不通。

      然后考虑采用整数移位法模拟浮点数运算,但是这样的话效率将比用浮点数除法还要低,在处理时间要求很高的场合能不用尽量不用。

      最后,考虑所需结果表达式可以调整为:tr(1/k - 1) = tr((t2 - t2')/ (t1 - t1') -1) =  tr((t2 - t2') - (t1 - t1')) /(t1 - t1')  , 处理之后,分子还是必须用64为长整型才能表示,还需进一步调整。分析可以发现,分母为1007939416, tr实际中数值一般为1ms左右,分子另一部分为77739,相乘比分母大两个数量级,所以分子分母同时除以1*e3不会影响结果,分子可以控制为32位整数。分母被除后剩余位数比最后结果大一位就一般不会影响结果。

    问题解决。如有疑问,请联系:[email protected]

猜你喜欢

转载自blog.csdn.net/dengjingen/article/details/7818724