2010-11-17 4 views
2

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

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

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

Спасибо!

ответ

2

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

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

Если вы хотите еще лучше p erformace использует полномочия 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 должно быть меньше, чем максимальное значение, которое можно хранить в слове (или двойное слово, если вы используете более длинные целые типы)

+0

Простите вопрос новичка, извините, но почему (например) 100 * x/y> z вместо 100 * x> z * y? –

+0

, потому что это было так, как я работал над математикой в ​​моей голове ... (это было время, так как на самом деле мне пришлось использовать эту технику), я отредактирую, способ чистого умножения более точен – tobyodavies

+0

Бинго! Спасибо, что помогли создать настоящий новичок. Если вам интересно, что вы мне помогли, я пытаюсь сделать часы пропеллера похожими на часы на жестком диске, которые вы можете увидеть на YouTube. Ценю вашу помощь! – Shaun

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