Ищете хорошую замену для расчета процента с использованием целочисленной математики - PullRequest
2 голосов
/ 17 ноября 2010

Я увлекаюсь программированием встроенного приложения. Приложение требует скорости. Я хотел бы определить, прошла ли определенная переменная (назовите ее «X») определенный процент (назовите его «Y») другой переменной (назовите ее «Z»).

X, Y и Z могут меняться во время выполнения. Поскольку мне нужна скорость, я хотел бы сделать это, используя целочисленную математику, а не float, что влечет за собой штраф за скорость.

Есть ли какие-нибудь хитрости для этого? Я программист-самоучка, поэтому извините, если это хорошо известная проблема с хорошо известным решением.

Спасибо!

1 Ответ

2 голосов
/ 17 ноября 2010

Итак, вы хотите протестировать 1*X > Z*Y, ничто не мешает вам сделать именно это, просто определите 1 (и, следовательно, 100%) как 10^decPlaces, где decPlaces>=2 (иначе вам не хватит точностиделать проценты как int s

, если вам нужно, чтобы расчеты были правильными с точностью до 4 dp, если X = 10, то X_fixed_precision = 100000, если Y составляет 30% (0,3), тогда Y_fixed_precision=3000 и если Z=10000затем z_fixed_precision=100000000 этот трюк называется арифметикой с фиксированной точностью ...

Если вы хотите, чтобы производительность была еще лучше, используйте степени 2 вместо 10 (ее сложнее перевести в точное количество десятичных разрядов, которое вы получите, но это должно бытьнесколько быстрее)

например, ваш код, вероятно, будет выглядеть как

if (ONE_FIXED_PRECISION * X_fixed_precision > Z_fixed_precision * Y_fixed_precision)
   // Do something

, где FOO_fixed_precision = FOO * ONE_FIXED_PRECISION

Будьте осторожны, чтобы избежать переполнения целыми числамихотя - максимальное значение X * ONE_FIXED_POINT * ONE_FIXED_POINT должно быть меньше максимального значения, которое вы можете сохранить в слове (или двойном слове, если вы используете более длинные целочисленные типы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...