我想检查一个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的一个版本.
因为-0.0f也比较0.0f符合IEEE-754标准的要求.
0x80000000如果这是一个主要的性能问题,您可以使用与-0()和+0 的整数表示进行比较来替换调用.(或者更好的是,掩盖符号位并进行比较0.0f).