C++ 如果没有太多的条件,如何避免被零除?

C++ 如果没有太多的条件,如何避免被零除?,c++,conditional,divide-by-zero,floating-point-exceptions,C++,Conditional,Divide By Zero,Floating Point Exceptions,我有一个整数参数,用来控制事件在特定运行中发生的次数 例如,如果每次运行的迭代次数为1000次,那么如果我希望每200次迭代发生一次事件,那么参数FREQ将为5次。但是,我希望能够更改迭代次数,但保持比率不变,如果我根本不希望事件发生,还希望能够将FREQ参数设置为0 以下是我目前正在使用的内容: int N_ITER = 1000; int FREQ = 5; void doRun(){ int count = 0; for (int i = 0; i < N_ITER

我有一个整数参数,用来控制事件在特定运行中发生的次数

例如,如果每次运行的迭代次数为1000次,那么如果我希望每200次迭代发生一次事件,那么参数
FREQ
将为5次。但是,我希望能够更改迭代次数,但保持比率不变,如果我根本不希望事件发生,还希望能够将
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();
        }            
    }
}
int N_ITER=1000;
int-FREQ=5;
void doRun(){
整数计数=0;
对于(int i=0;i0){
如果(计数
这很好,但它不适合我使用嵌套的条件,特别是当我有两批
doSomething()
时,我觉得它应该能够更容易地完成

我尝试将一个条件的
if(FREQ>0&&count
设置为一个条件的
if(FREQ>0&&count
,但很明显,由于被零除,这引发了一个
浮点异常


我也尝试过使用try/catch块,但就混乱程度而言,它与使用嵌套条件句没有什么不同。这个问题有更优雅的解决方案吗?

重新安排条件如何?使用
count*FREQ
代替
count
。如果
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;
        }
    }
}
int N_ITER=1000;
int-FREQ=5;
void doRun(){
整数计数=0;
对于(int i=0;i
“我尝试将一个条件设置为if(FREQ>0&&count
,但很明显,由于被零除,这引发了浮点异常。”这是不可能的<如果
FREQ>0
为假,code>&
会短路并阻止对
N\u ITER/FREQ
的求值。
继续
有助于减少嵌套。另外,请注意,尽管名为“浮点异常”,但它实际上不是异常,您无法捕获它。相反,它是一个整数除以零可以提高SIGFPE。演示:@HolyBlackCat很吸引人。在这种情况下,浮点除零可能返回NaN。但由于有符号整数溢出,这可能会导致不同类型的UB。@VTT好的,这取决于
N_ITER+FREQ
的最大值,在OP的示例中,该值远远不够大。此外,该类型始终可以更改为更大的类型,如
unsigned long