exponenta event banner

Недопустимая операция для плавающих элементов

Результатом операции с плавающей запятой является NaN для операндов, не являющихся NaN

Описание

Эта проверка определяет, является ли результатом операции с плавающей запятой NaN. Проверка выполняется только в том случае, если включен режим проверки, включающий NaN, и указано, что при проверке должны выделяться операции, приводящие к NaN.

Если указано, что проверка должна выдавать предупреждение для NaN, выполняется следующая проверка:

  • Красный, если операция создает NaN на всех путях выполнения, которые считает программное обеспечение, и операнды не являются NaN.

  • Оранжевый, если операция создает NaN на некоторых путях выполнения, когда операнды не являются NaN.

  • Зеленый, если операция не создает NaN, если операнды не являются NaN.

Если указано, что проверка должна запрещать NaN, цвет проверки зависит только от результата операции. Цвет не зависит от операндов.

Проверка также выделяет преобразования из переменных с плавающей запятой в целые числа, где переменная с плавающей запятой может быть NaN. В этом случае проверка всегда выполняется при включении NaNs в проверку и не допускает NaNs в качестве входных данных для преобразования.

Чтобы включить этот режим проверки, используйте следующие параметры:

Примеры

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

Результаты в forbid режим:

double func(void) {
    double x=1.0/0.0;
    double y=x-x;
    return y;
}
В этом примере оба операнда - операции не являются NaN, но результатом является NaN. Проверка недопустимости операции для плавающих элементов на - операция красного цвета. В forbid проверка прекращается после проверки красным цветом. Например, неинициализированная проверка локальной переменной не отображается на y в return заявление.

Результаты в warn-first режим:

double func(void) {
    double x=1.0/0.0;
    double y=x-x;
    return y;
}
В этом примере оба операнда - операции не являются NaN, но результатом является NaN. Проверка недопустимости операции для плавающих элементов на - операция красного цвета. Красный цвет возвращается warn-first отличаются от красных чеков для других типов чеков. Проверка не прекращается после красной проверки. Например, зеленая неинициализированная проверка локальной переменной появляется на y в return заявление. При установке курсора y в результате проверки видно, что она имеет значение NaN.

Результаты в forbid режим:

double func(double arg1, double arg2) {
    double ret=arg1-arg2;
    return ret;
}
В этом примере значения arg1 и arg2 неизвестны для проверки. Проверка предполагает, что arg1 и arg2 может быть как бесконечным, например, так и результатом arg1-arg2 может быть NaN. В forbid после проверки проверка завершает путь выполнения, который приводит к NaN. При установке курсора ret в return оператор, он не имеет значения NaN.

Результаты в warn-first режим:

double func(double arg1, double arg2) {
    double ret=arg1-arg2;
    return ret;
}
В этом примере значения arg1 и arg2 неизвестны для проверки. Проверка предполагает, что arg1 и arg2 может быть как бесконечным, например, так и результатом arg1-arg2 может быть NaN. Оранжевый возвращается warn-first режим отличается от оранжевых чеков для других типов чеков. После проверки проверка не завершает путь выполнения, который приводит к NaN. При установке курсора ret в return оператор, он продолжает иметь значение NaN наряду с другими возможными значениями.

double func(double arg1, double arg2) {
    double z=arg1-arg2;
    return z;
}

void caller() {
    double x=1.0/0.0;
    double y=x-x;
    func(x,x);
    func(y,y);
}

В этом примере в func, результат - операция всегда имеет значение NaN, но при проверке floats операция Invalid имеет оранжевый, а не красный цвет.

  • В первом вызове func, оба операнда arg1 и arg2 не являются NaN, но результатом является NaN. Итак, чек красный.

  • Во втором вызове func, оба операнда arg1 и arg2 являются NaN, и поэтому результатом является NaN. Таким образом, проверка зеленая, указывая, что результат не является NaN, если операнды не являются NaN.

Объединение цветов для двух вызовов func, чек оранжевый.

В примере опция -check-nan warn-first был использован.

void func() {
    double x= 1.0/0.0;
    double y= x-x;
    int z = y;
}

В этом примере проверка Invalid operation on floats обнаруживает назначение NaN целочисленной переменной z.

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

Информация о результатах

Группа: Числовые
Язык: C | C++
Акроним: INVALID_FLOAT_OP
Представлен в R2016a