Быстрые альтернативы умножению с плавающей запятой для расчета процентов - PullRequest
4 голосов
/ 14 января 2012

Я пишу некоторый код на Arduino, который должен работать быстро и делать грубые приближения к процентам целых чисел.

Например, учитывая число, которое я хочу найти 90%, или 70%, или 30% и т. Д. Очевидный способ сделать это - умножить на число с плавающей точкой, например х * 0,9; или х * 0,3; Но поскольку мне нужна скорость, я хочу избежать вычисления с плавающей запятой. Если бы я просто делил на степень два, я бы сделал побитовый сдвиг, но есть ли похожие методы для приближения 90%, 80% и т. Д. С использованием целых чисел?

Ответы [ 2 ]

4 голосов
/ 14 января 2012

Вы можете аппроксимировать эти проценты фракциями со знаменателем степени двух.

Вот простой пример с 2^16:

90% = 90 / 100 ~ 58982 / 65536
70% = 70 / 100 ~ 45875 / 65536
30% = 30 / 100 ~ 19661 / 65536

 x% =  x / 100 ~ x * 655 / 65536

Деления (которые теперь являются степенями двойки) могут быть выполнены сменами.

Конечно, для генерации этих дробей может потребоваться некоторое предварительное вычисление.

2 голосов
/ 15 января 2012

битовое смещение Как я могу умножить и разделить, используя только битовое смещение и сложение?

Вы можете использовать битовое смещение для умножения и деления, например, arx x = (x * 9) / 10

Что касается примера кода, если вы застряли, я мог бы попробовать исжечь некоторые клетки мозга, чтобы решить это.Просто спросите:)

...