我想检查一个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
__nesf2 显然是比较两个浮点数。为什么它不直接对0.0f进行整数形式的比较,即0x00000000?它为什么不这样做或者说这只是一次未能实现的优化机会?
我的编译器是MPLAB C30,是GCC v3.23的一个版本。