Invalid operation on floats

Результатом операции с плавающей точкой является NaN для операндов non-NaN

Описание

Эта проверка определяет, является ли результатом операции с плавающей точкой NaN. Проверка выполнена, только если вы включаете режим верификации, который включает NaNs, и укажите, что верификация должна подсветить операции тот результат в 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. Invalid operation on floats проверяет - операция является красной. В forbid режим, остановки верификации после красной проверки. Например, проверка Non-initialized local variable не появляется на y в return оператор.

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

double func(void) {
    double x=1.0/0.0;
    double y=x-x;
    return y;
}
В этом примере, оба операнды - операцией не является NaN, но результатом является NaN. Invalid operation on floats проверяет - операция является красной. Красные регистрации warn-first режим отличается от красных проверок на другие типы проверки. Верификация не останавливается после красной проверки. Например, зеленая проверка Non-initialized local variable появляется на 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, но проверка Invalid operation on floats является оранжевой вместо красного.

  • В первом вызове 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