4

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

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

+1

90% x = (x * 9)/10 – arx

ответ

4

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

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

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

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

Разделение (которые в настоящее время являются полномочиями двоих детей) может быть сделано со сдвигами.

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

+0

А ... это выглядит многообещающим. Итак, x% от y (y * x * 655/65536)? – interstar

+0

Да, это правильно. '2^16' должен быть достаточно точным. Если вам нужна более высокая точность, вы всегда можете использовать что-то большее, чем '2^16'. – Mysticial

+1

Вы также попробуете '(y * x * 655 + 32768)/65536', если хотите, чтобы он округлился лучше. – Mysticial

2

бит сдвига How can I multiply and divide using only bit shifting and adding?

Вы можете использовать немного сдвигая для умножать и делить ARX пример х = (х * 9)/10

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

Смежные вопросы