-check-subnormal)Обнаружьте операции, которые приводят к субнормальным значениям с плавающей точкой
Эта опция влияет на анализ Программы автоматического доказательства Кода только.
Укажите, что верификация должна проверять операции с плавающей точкой на субнормальные результаты.
Пользовательский интерфейс (только десктопные решения): В вашей настройке проекта опция находится на узле Check Behavior.
Командная строка: Используйте опцию -check-subnormal. Смотрите информацию о командной строке.
Используйте эту опцию, чтобы обнаружить операции с плавающей точкой, которые приводят к субнормальным значениям.
Субнормальные числа имеют величины меньше, чем самое маленькое число с плавающей запятой, которое может быть представлено без начальных нулей в мантиссе. Присутствие субнормальных чисел указывает на потерю значительных цифр. Эта потеря может накопиться по последующим операциям и в конечном счете привести к неожиданным значениям. Субнормальные числа могут также замедлить выполнение на целях без аппаратной поддержки.
Значение по умолчанию: allow
allow Верификация не проверяет операции на субнормальные результаты.
forbid Верификация проверяет на субнормальные результаты.
Верификация останавливает путь к выполнению субнормальным результатом и препятствует тому, чтобы субнормальные значения распространили далее. Поэтому на практике вы видите только первое вхождение субнормального значения.
warn-all Верификация проверяет на субнормальные результаты и подсветки все случаи субнормальных значений. Даже если субнормальный результат прибывает из предыдущих субнормальных значений, результат подсвечен.
Верификация продолжается, даже если проверка является красной.
warn-first Проверки верификации на субнормальные результаты, но только подсвечивают первые случаи субнормальных значений. Если субнормальное значение распространяет к дальнейшим субнормальным результатам, те последующие результаты не подсвечены.
Верификация продолжается, даже если проверка является красной.
Для получения дополнительной информации результирующих цветов в каждом режиме, смотрите Subnormal float (Polyspace Code Prover Access).
Если вы хотите видеть только те операции, где субнормальное значение происходит из несубнормальных операндов, используйте 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 - источники |
Пример (сервер программы автоматического доказательства кода):
сервер программы автоматического доказательства полипробела кода - источники |