exponenta event banner

Режим субнормального обнаружения (-check-subnormal)

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

Описание

Этот параметр влияет только на анализ программы проверки кода.

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

Задать опцию

Пользовательский интерфейс (только для настольных ПК): в конфигурации проекта параметр находится в узле Проверить поведение.

файл командной строки и параметров: Использовать параметр -check-subnormal. См. раздел Сведения о командной строке.

Зачем использовать этот параметр

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

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

Настройки

По умолчанию: allow

allow

Проверка не проверяет операции на наличие субнормальных результатов.

forbid

Проверка проверяет субнормальные результаты.

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

warn-all

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

Проверка продолжается, даже если проверка красного цвета.

warn-first

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

Проверка продолжается, даже если проверка красного цвета.

Для получения подробной информации о цветах результатов в каждом режиме см. Subnormal float.

Совет

  • Если требуется просмотреть только те операции, в которых субнормальное значение происходит от ненормальных операндов, используйте warn-first режим.

    Например, в следующем коде: arg1 и arg2 неизвестны. При проверке предполагается, что они могут принимать все значения, допустимые для данного типа. double. Это предположение может привести к субнормальным результатам определенных операций. Если вы используете warn-first первая операция, вызывающая субнормальный результат, подсвечивается.

    warn-allwarn-first

    void func (double arg1, double arg2) 
    {
    	  double difference1 = arg1 - arg2;
    	  double difference2 = arg1 - arg2;
    	  double val1 = difference1 * 2;
    	  double val2 = difference2 * 2;
    }
    
    

    В этом примере все четыре операции могут иметь субнормальные результаты. Четыре проверки субнормальных результатов оранжевые.

    void func (double arg1, double arg2) 
    {
    	  double difference1 = arg1 - arg2;
    	  double difference2 = arg1 - arg2;
    	  double val1 = difference1 * 2;
    	  double val2 = difference2 * 2;
    }
    

    В этом примере: difference1 и difference2 может быть субнормальным, если arg1 и arg2 достаточно близко. Первые две проверки для субнормальных результатов оранжевые. val1 и val2 не может быть субнормальным, если difference1 и difference2 являются субнормальными. Последние две проверки для субнормальных результатов имеют зеленый цвет.

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

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

    Например, в следующем коде: arg1 и arg2 неизвестны. При проверке предполагается, что они могут принимать все значения, допустимые для данного типа. double. Это предположение может привести к субнормальным результатам для arg1-arg2. Если вы используете forbid режим и выполнение операции arg1-arg2 дважды последовательно выделяется только первая операция. Вторая операция не подсвечивается, поскольку субнормальный результат для второй операции возникает по той же причине, что и первая операция.

    warn-allforbid

    void func (double arg1, double arg2) 
    {
    	  double difference1 = arg1 - arg2;
    	  double difference2 = arg1 - arg2;
    	  double val1 = difference1 * 2;
    	  double val2 = difference2 * 2;
    }
    
    

    В этом примере все четыре операции могут иметь субнормальные результаты. Четыре проверки субнормальных результатов оранжевые.

    void func (double arg1, double arg2) 
    {
    	  double difference1 = arg1 - arg2;
    	  double difference2 = arg1 - arg2;
    	  double val1 = difference1 * 2;
    	  double val2 = difference2 * 2;
    }
    

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

    • Близкие значения arg1 и arg2 что привело к субнормальному значению difference1.

      В последующей операции arg1 - arg2, чек зеленый и difference2 не является субнормальным. Результат проверки на difference2 * 2 зеленый по той же причине.

    • Субнормальное значение difference1.

      В последующей операции difference1 * 2, чек зеленый.

Информация командной строки

Параметр: -check-subnormal
Значение: allow | warn-first | warn-all | forbid
По умолчанию: allow
Пример (проверка кода): polyspace-code-prover -sources file_name -check-subnormal forbid
Пример (сервер проверки кода): polyspace-code-prover-server -sources file_name -check-subnormal forbid
Представлен в R2016b