Я хочу проверить, имеет ли 32-разрядное число IEEE754 значение 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.