Division by zero

Деление на нуль происходит

Описание

Эта проверка определяет, является ли правильный операнд деления или операции модуля нулем.

Примеры

развернуть все

#include <stdio.h>

void main() {
    int x=2;
    printf("Quotient=%d",100/(x-2));
}

В этом примере, знаменатель x-2 нуль.

Коррекция — Проверка на нулевой знаменатель

Одна возможная коррекция должна проверять на нулевой знаменатель перед делением.

В сложном коде это затрудняет, чтобы отслеживать значения и избежать нулевых знаменателей. Поэтому это - хорошая практика, чтобы проверять на нулевой знаменатель перед каждым делением.

#include <stdio.h>
int input();
void main() {
    int x=input();
    if(x>0) { //Avoid overflow
        if(x!=2 && x>0)
            printf("Quotient=%d",100/(x-2));
        else
            printf("Zero denominator.");
    }
}
#include <stdio.h>
void main() {
    int x=-10;
    for (int i=0; i<10; i++)
        x+=3;
    printf("Quotient=%d",100/(x-20));
}

В этом примере, знаменатель x-20 нуль.

Коррекция — Проверка на нулевой знаменатель

Одна возможная коррекция должна проверять на нулевой знаменатель перед делением.

После нескольких итераций for цикл, это затрудняет, чтобы отслеживать значения и избежать нулевых знаменателей. Поэтому это - хорошая практика, чтобы проверять на нулевой знаменатель перед каждым делением.

#include <stdio.h>
#define MAX 10000
int input();

void main() {
    int x=input();
    for (int i=0; i<10; i++) {
        if(x < MAX) //Avoid overflow
            x+=3;
    }

    if(x>0) { //Avoid overflow
        if(x!=20)
            printf("Quotient=%d",100/(x-20));
        else
            printf("Zero denominator.");
    }
}
#include<stdio.h>

void main() {
    printf("Sequence of ratios: \n");
    for(int count=-100; count<=100; count++)
        printf(" %.2f ", 1/count);
}

В этом примере, count запуски от-100 до 100 через нуль. Когда count нуль, проверка Division by zero возвращает красную ошибку. Поскольку проверка возвращается зеленый в другом for запуски цикла, / символ является оранжевым.

На for существует также красная ошибка Non-terminating loop цикл. Эта красная ошибка указывает на определенную ошибку в одном из запусков цикла.

Коррекция — Проверка на нулевой знаменатель

Одна возможная коррекция должна проверять на нулевой знаменатель перед делением.

#include<stdio.h>

void main() {
    printf("Sequence of ratios: \n");
    for(int count=-100; count<=100; count++) {
        if(count != 0)
            printf(" %.2f ", 1/count);
        else
            printf(" Infinite ");
    }
}
#include <stdio.h>
#include <math.h>

#define stepSize 0.1

void main() {
    float divisor = -1.0;
    int numberOfSteps = (int)((2.0*1.0)/stepSize);

    printf("Divisor running from -1.0 to 1.0\n");
    for(int count = 1; count <= numberOfSteps; count++) {
        divisor+= stepSize;
	divisor = ceil(divisor * 10.) / 10.; // one digit of imprecision
        printf(" .2f ", 1.0/divisor);
    }
}

В этом примере, divisor запуски от –1.0 до 1,0 до 0,0. Когда divisor 0.0, проверка Division by zero возвращает красную ошибку. Поскольку проверка возвращается зеленый в другом for запуски цикла, / символ является оранжевым.

На for нет никакой красной ошибки Non-terminating loop цикл. Красная ошибка не появляется, потому что Polyspace® аппроксимирует значения divisor более широкой областью значений. Поэтому Polyspace не может определить, существует ли определенная ошибка в одном из запусков цикла.

Коррекция — Проверка на нулевой знаменатель

Одна возможная коррекция должна проверять на нулевой знаменатель перед делением. Для float переменные, не проверяйте, является ли знаменатель точно нулевым. Вместо этого проверяйте, является ли знаменатель в узком диапазоне вокруг нуля.

#include <stdio.h>
#include <math.h>

#define stepSize 0.1

void main() {
    float divisor = -1.0;
    int numberOfSteps = (int)((2*1.0)/stepSize);

    printf("Divisor running from -1.0 to 1.0\n");;
    for(int count = 1; count <= numberOfSteps; count++) {
        divisor += stepSize;
	divisor = ceil(divisor * 10.) / 10.; // one digit of imprecision
        if(divisor < -0.00001 || divisor > 0.00001)
            printf(" .2f ", 1.0/divisor);
        else
            printf(" Infinite ");
    }
}

Проверяйте информацию

Группа: числовой
Язык: C | C++
Акроним: ZDV