Как я могу избежать деления на ноль без слишком большого количества условных выражений? - PullRequest
0 голосов
/ 03 ноября 2018

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

Например, если число итераций для каждого прогона равно 1000, тогда параметр FREQ будет равен 5, если бы я хотел, чтобы событие происходило каждые 200 итераций. Тем не менее, я хочу иметь возможность изменять количество итераций, но сохранять соотношение одинаковым, а также иметь возможность установить для параметра FREQ значение 0, если я не хочу, чтобы событие вообще происходило.

Вот что я сейчас использую:

int N_ITER = 1000;
int FREQ = 5;

void doRun(){
    int count = 0;
    for (int i = 0; i < N_ITER; ++i){
        if (FREQ > 0){
            if (count < N_ITER/FREQ){
                doSomething();
                count++;
            }
            else{
                doSomethingElse();
                count = 0;
            }
        }
        else{
            doSomething();
        }            
    }
}

Это прекрасно работает, но не подходит, если у меня есть вложенные условные выражения, особенно когда у меня есть две партии doSomething(), я чувствую, что это может быть выполнено легче, чем это.

Я пытался сделать одно условное if (FREQ > 0 && count < N_ITER/FREQ), но, очевидно, бросил Floating point exception из-за деления на ноль.

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

1 Ответ

0 голосов
/ 03 ноября 2018

Как насчет перестановки состояния? Вместо count < N_ITER/FREQ используйте count*FREQ < N_ITER. Если FREQ = 0, выражение все равно будет истинным.

int N_ITER = 1000;
int FREQ = 5;

void doRun() {
    int count = 0;
    for (int i = 0; i < N_ITER; ++i) {
        if (count*FREQ < N_ITER) {
            doSomething();
            count++;
        } else {
            doSomethingElse();
            count = 0;
        }
    }
}
...