-check-subnormal)Обнаружение операций, приводящих к субнормальным значениям с плавающей запятой
Этот параметр влияет только на анализ программы проверки кода.
Укажите, что проверка должна проверять операции с плавающей запятой на наличие субнормальных результатов.
Пользовательский интерфейс (только для настольных ПК): в конфигурации проекта параметр находится в узле Проверить поведение.
файл командной строки и параметров: Использовать параметр -check-subnormal. См. раздел Сведения о командной строке.
Эта опция используется для обнаружения операций с плавающей запятой, которые приводят к субнормальным значениям.
Субнормальные числа имеют величины, меньшие, чем наименьшее число с плавающей запятой, которое может быть представлено без ведущих нулей в значительном. Наличие субнормальных чисел указывает на потерю значащих цифр. Эти потери могут накапливаться в ходе последующих операций и в конечном итоге приводить к неожиданным значениям. Субнормальные числа также могут замедлять выполнение на целевых объектах без аппаратной поддержки.
По умолчанию: allow
allow Проверка не проверяет операции на наличие субнормальных результатов.
forbid Проверка проверяет субнормальные результаты.
Проверка останавливает путь выполнения с субнормальным результатом и предотвращает дальнейшее распространение субнормальных значений. Поэтому на практике отображается только первое вхождение субнормального значения.
warn-all Проверка проверяет субнормальные результаты и выделяет все вхождения субнормальных значений. Даже если субнормальный результат получен из предыдущих субнормальных значений, результат подсвечивается.
Проверка продолжается, даже если проверка красного цвета.
warn-first Проверка проверяет субнормальные результаты, но выделяет только первые вхождения субнормальных значений. Если субнормальное значение распространяется на дальнейшие субнормальные результаты, эти последующие результаты не подсвечиваются.
Проверка продолжается, даже если проверка красного цвета.
Для получения подробной информации о цветах результатов в каждом режиме см. Subnormal float.
Если требуется просмотреть только те операции, в которых субнормальное значение происходит от ненормальных операндов, используйте warn-first режим.
Например, в следующем коде: arg1 и arg2 неизвестны. При проверке предполагается, что они могут принимать все значения, допустимые для данного типа. double. Это предположение может привести к субнормальным результатам определенных операций. Если вы используете warn-first первая операция, вызывающая субнормальный результат, подсвечивается.
warn-all | warn-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;
}
В этом примере: При проверке красным/оранжевым цветом отображается только первый экземпляр, в котором отображается субнормальное значение. Проверки красного/оранжевого цвета из этих субнормальных значений, распространяющихся на последующие операции, не отображаются. |
Если вы хотите видеть, где происходит субнормальное значение, и не хотите видеть субнормальные результаты, возникающие из одной и той же причины более одного раза, используйте forbid режим.
Например, в следующем коде: arg1 и arg2 неизвестны. При проверке предполагается, что они могут принимать все значения, допустимые для данного типа. double. Это предположение может привести к субнормальным результатам для arg1-arg2. Если вы используете forbid режим и выполнение операции arg1-arg2 дважды последовательно выделяется только первая операция. Вторая операция не подсвечивается, поскольку субнормальный результат для второй операции возникает по той же причине, что и первая операция.
warn-all | forbid |
|---|---|
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;
}
В этом примере:
|
Параметр: -check-subnormal |
Значение: allow | warn-first | warn-all | forbid |
По умолчанию: allow |
Пример (проверка кода): polyspace-code-prover -sources |
Пример (сервер проверки кода):
polyspace-code-prover-server -sources |