Так вроде как fixed-point арифметика уже имеется. Я точно с чем-то подобным сталкивался с год назад или даже ранее.
Глянул: из хелпа, идущего с avr-gcc 4.5.1
А патч для зараждающейся поддержки Fixed-Point в avr-gcc идёт ИМХО со времён avr-gcc 4.4.3, возможно и ещё раньше.
CODE
6.14 Fixed-Point Types
As an extension, the GNU C compiler supports fixed-point types as defined in the N1169 draft of ISO/IEC DTR 18037.
Support for fixed-point types in GCC will evolve as the draft technical report changes.
Calling conventions for any target might also change. Not all targets support fixed-point types.
The fixed-point types are
short _Fract, _Fract, long _Fract, long long _Fract, unsigned short _Fract, unsigned _Fract,
unsigned long _Fract, unsigned long long _Fract, _Sat short _Fract, _Sat _Fract, _Sat
long _Fract, _Sat long long _Fract, _Sat unsigned short _Fract, _Sat
unsigned _Fract, _Sat unsigned long _Fract, _Sat unsigned long long _Fract,
short _Accum, _Accum, long _Accum, long long _Accum, unsigned short _Accum,
unsigned _Accum, unsigned long _Accum, unsigned long long _Accum, _Sat short _Accum,
_Sat _Accum, _Sat long _Accum, _Sat long long _Accum, _Sat unsigned short _Accum,
_Sat unsigned _Accum, _Sat unsigned long _Accum, _Sat unsigned long long _Accum.
Fixed-point data values contain fractional and optional integral parts.
The format of fixed-point data varies and depends on the target machine.
Support for fixed-point types includes:
prefix and postfix increment and decrement operators (++, --)
unary arithmetic operators (+, -, !)
binary arithmetic operators (+, -, *, /)
binary shift operators (<<, >>)
relational operators (<, <=, >=, >)
equality operators (==, !=)
assignment operators (+=, -=, *=, /=, <<=, >>=)
conversions to and from integer, floating-point, or fixed-point types
Use a suffix in a fixed-point literal constant:
‘hr’ or ‘HR’ for short _Fract and _Sat short _Fract
‘r’ or ‘R’ for _Fract and _Sat _Fract
‘lr’ or ‘LR’ for long _Fract and _Sat long _Fract
‘llr’ or ‘LLR’ for long long _Fract and _Sat long long _Fract
‘uhr’ or ‘UHR’ for unsigned short _Fract and _Sat unsigned short _Fract
‘ur’ or ‘UR’ for unsigned _Fract and _Sat unsigned _Fract
‘ulr’ or ‘ULR’ for unsigned long _Fract and _Sat unsigned long _Fract
‘ullr’ or ‘ULLR’ for unsigned long long _Fract and _Sat unsigned long long _Fract
‘hk’ or ‘HK’ for short _Accum and _Sat short _Accum
‘k’ or ‘K’ for _Accum and _Sat _Accum
‘lk’ or ‘LK’ for long _Accum and _Sat long _Accum
‘llk’ or ‘LLK’ for long long _Accum and _Sat long long _Accum
‘uhk’ or ‘UHK’ for unsigned short _Accum and _Sat unsigned short _Accum
‘uk’ or ‘UK’ for unsigned _Accum and _Sat unsigned _Accum
‘ulk’ or ‘ULK’ for unsigned long _Accum and _Sat unsigned long _Accum
‘ullk’ or ‘ULLK’ for unsigned long long _Accum and _Sat unsigned long long _Accum
GCC support of fixed-point types as specified by the draft technical report is incomplete:
Pragmas to control overflow and rounding behaviors are not implemented.
Fixed-point types are supported by the DWARF2 debug information format.
Я не пробовал это использовать. Лишь глазом зацепился.
Про сравнения... Я только по функциональным возможностям сравнил - не более.