C++ 如果没有太多的条件,如何避免被零除?
我有一个整数参数,用来控制事件在特定运行中发生的次数 例如,如果每次运行的迭代次数为1000次,那么如果我希望每200次迭代发生一次事件,那么参数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
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
。