А поскольку Arduino IDE использует С++ по-умолчанию (не уверен, что можно переключиться на чистый Си), то мамкины робототехники не могут реализиовать быстрые математические алгоритмы на AVR, и поэтому их поделия такие тяжёлые и медленные. Хотя, лично я не замерял разницу между встроенной и ручной реализацией. AVR instruction set говорит, что для умножение нужно сделать дополнительный сдвиг, и вроде как команда FMUL делает это за один такт. Другое дело, что со встроенной поддержкой гораздо труднее допустить ошибку при переходе к/от целочисленных типов.
Re: TIL: GNU C++ не поддерживает fixed-point arithmetic
Здравствуйте, T4r4sB, Вы писали:
TB>А какие им нужны интринсики? Длинное умножение/деление и длинный сдвиг?
Зависит от реализации, я думаю. Конкретно для AVR никакие не нужны, можно всё сделать вручную. И, как я уже сказал, разница лишь в аппаратной поддержке инструкции FMUL, которая аналогична MUL, но сдвигает результат умножения влево на один бит, чтобы оставаться в формате 1 целый бит, 7 дробных (тип _Fract). Для ARM всё иначе, там есть даже поддержка целочисленного квадратного корня. Но всё это реализовано на уровня компилятора (поддержка типов _Fract, _Accum, _Sat), а не интринсиков.