将浮点数与零进行比较

Tho*_*s O 4 c floating-point

我想检查一个IEEE754 32位数字是否具有正好0.0f的值(它偶尔会被设置为它.)累积误差将为零,因为数据将经常从传感器更新.我的处理器没有硬件FPU,因此操作在相当快的软件库中完成.但是,对于诸如加,减和比较之类的事情,它仍然有数百个周期.

所以我想知道为什么我的编译器这样做:

240:                 if(p_viewer->roll != 0.0f)
 03FBC  B81160     mul.uu w2,#0,w2
 03FBE  900A2E     mov.w [w14+20],w4
 03FC0  900064     mov.w [w4+12],w0
 03FC2  9000F4     mov.w [w4+14],w1
 03FC4  07E91F     rcall __nesf2
 03FC6  E00000     cp0.w w0
 03FC8  320054     bra z, 0x004072
Run Code Online (Sandbox Code Playgroud)

__nesf2显然比较了两个浮点数.为什么不对整数形式的0.0f进行比较,即0x00000000?有什么理由不这样做,还是只是错过了优化机会?

我的编译器是MPLAB C30,GCC v3.23的一个版本.

Ste*_*non 7

因为-0.0f也比较0.0f符合IEEE-754标准的要求.

0x80000000如果这是一个主要的性能问题,您可以使用与-0()和+0 的整数表示进行比较来替换调用.(或者更好的是,掩盖符号位并进行比较0.0f).