TIL: GNU C++ не поддерживает fixed-point arithmetic
От: cppguard  
Дата: 09.05.23 08:52
Оценка:
А поскольку Arduino IDE использует С++ по-умолчанию (не уверен, что можно переключиться на чистый Си), то мамкины робототехники не могут реализиовать быстрые математические алгоритмы на AVR, и поэтому их поделия такие тяжёлые и медленные. Хотя, лично я не замерял разницу между встроенной и ручной реализацией. AVR instruction set говорит, что для умножение нужно сделать дополнительный сдвиг, и вроде как команда FMUL делает это за один такт. Другое дело, что со встроенной поддержкой гораздо труднее допустить ошибку при переходе к/от целочисленных типов.
Re: TIL: GNU C++ не поддерживает fixed-point arithmetic
От: Zhendos  
Дата: 09.05.23 09:23
Оценка:
Здравствуйте, cppguard, Вы писали:

C>А поскольку Arduino IDE использует С++ по-умолчанию (не уверен, что можно переключиться на чистый Си)


А причем здесь C или C++? И там и там есть ассемблерные вставки и доступ к "instrict" компилятора.
Re[2]: TIL: GNU C++ не поддерживает fixed-point arithmetic
От: cppguard  
Дата: 09.05.23 09:57
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>А причем здесь C или C++? И там и там есть ассемблерные вставки и доступ к "instrict" компилятора.


Типы _Fract и _Accum поддерживаются на уровне компилятора. Я не слышал про интринсики для fixed-point.
Re[3]: TIL: GNU C++ не поддерживает fixed-point arithmetic
От: T4r4sB Россия  
Дата: 09.05.23 16:11
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Я не слышал про интринсики для fixed-point.


А какие им нужны интринсики? Длинное умножение/деление и длинный сдвиг?
Re[4]: TIL: GNU C++ не поддерживает fixed-point arithmetic
От: cppguard  
Дата: 09.05.23 22:43
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>А какие им нужны интринсики? Длинное умножение/деление и длинный сдвиг?


Зависит от реализации, я думаю. Конкретно для AVR никакие не нужны, можно всё сделать вручную. И, как я уже сказал, разница лишь в аппаратной поддержке инструкции FMUL, которая аналогична MUL, но сдвигает результат умножения влево на один бит, чтобы оставаться в формате 1 целый бит, 7 дробных (тип _Fract). Для ARM всё иначе, там есть даже поддержка целочисленного квадратного корня. Но всё это реализовано на уровня компилятора (поддержка типов _Fract, _Accum, _Sat), а не интринсиков.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.