Плавающий режим округления (-float-rounding-mode)

Задайте округление режимов, чтобы рассмотреть при определении результатов арифметики с плавающей точкой

Описание

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

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

Установите опцию

Пользовательский интерфейс (только десктопные решения): В вашей настройке проекта опция доступна на узле Verification Assumptions.

Командная строка: Используйте опцию -float-rounding-mode. Смотрите информацию о Командной строке.

Почему использование эта опция

Верификация по умолчанию использует режим раунда-к-самому-близкому.

Используйте округляющийся режим all, если ваш код содержит стандартные программы, такие как fesetround, чтобы задать округляющийся режим кроме раунда-к-самому-близкому. Несмотря на то, что верификация игнорирует спецификацию fesetround, она рассматривает все режимы округления включая округляющийся режим, который вы задали. Также для целей, которые могут использовать расширенную точность (например, с помощью флага -mfpmath=387), используют округляющийся режим all. Однако для ваших результатов анализа Polyspace®, чтобы согласиться с поведением во время выполнения, необходимо предотвратить использование расширенной точности через флаг, такой как -ffloat-store.

В противном случае продолжите использовать режим to-nearest округления значения по умолчанию. Поскольку все режимы округления рассматриваются, когда вы задаете all, у вас может быть много оранжевых проверок Overflow, следующих из сверхприближения.

Настройки

Значение по умолчанию: to-nearest

to-nearest

Верификация принимает режим раунда-к-самому-близкому.

all

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

Советы

  • Анализ Polyspace использует арифметику с плавающей точкой, которая соответствует стандарту IEEE® 754. Например, арифметика использует инструкции с плавающей точкой, существующие в системе команд SSE. Флаг -mfpmath=sse GNU® C осуществляет использование этой системы команд. Если вы используете компилятор C GNU с этим флагом, чтобы скомпилировать ваш код, ваши результаты анализа Polyspace соглашаются с вашим поведением во время выполнения.

    Однако, если ваш код использует расширенную точность, например, с помощью флага GNU C -mfpmath=387, результаты анализа Polyspace не могут согласиться с поведением во время выполнения в некоторых угловых случаях. Смотрите некоторые примеры этих угловых случаев в codeprover_limitations.pdf в polyspaceroot\polyspace\verifier\code_prover_desktop. Здесь, polyspaceroot является папкой установки Polyspace, например, C:\Program Files\Polyspace\R2019a.

    Чтобы предотвратить использование расширенной точности, на целях без поддержки SSE, можно использовать флаг, такой как -ffloat-store. Для вашего анализа Polyspace используйте all для округления режима, чтобы составлять двойное округление.

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

    Режим Rounding: to-nearestРежим Rounding: all

    Если результаты операций с плавающей точкой округлены к самым близким значениям:

    • В первой операции сложения eps1 является только достаточно большим, что значение, самое близкое к FLT_MAX + eps1, больше, чем FLT_MAX. Проверка Overflow является красной.

    • Во второй операции сложения eps2 является только достаточно маленьким, что значением, самым близким к FLT_MAX + eps2, является FLT_MAX. Проверка Overflow является зеленой.

    #include <float.h>
    #define eps1 0x1p103
    #define eps2 0x0.FFFFFFp103
    
    float func(int ch) {
        float left_op = FLT_MAX;
        float right_op_1 = eps1, right_op_2 = eps2;
        switch(ch) {
        case 1:
            return (left_op + right_op_1);
        case 2:
            return (left_op + right_op_2);
        default:
            return 0;
        }
    }
    

    Помимо к-самому-близкому режима, проверка Overflow также рассматривает другие режимы округления.

    • В первой операции сложения, в к-самому-близкому режиме, значение, самое близкое к FLT_MAX + eps1, больше, чем FLT_MAX, таким образом, сложение переполняется. Но, если округлено к отрицательной бесконечности, результатом является FLT_MAX, таким образом, сложение не переполняется. Комбинируя эти два округляющихся режима, проверка Overflow является оранжевой.

    • Во второй операции сложения, в к-самому-близкому режиме, значением, самым близким к FLT_MAX + eps2, является FLT_MAX, таким образом, сложение не переполняется. Но, если округлено к положительной бесконечности, результат больше, чем FLT_MAX, таким образом, сложение переполняется. Комбинируя эти два округляющихся режима, проверка Overflow является оранжевой.

    #include <float.h>
    #define eps1 0x1p103
    #define eps2 0x0.FFFFFFp103
    
    float func(int ch) {
        float left_op = FLT_MAX;
         float right_op_1 = eps1, right_op_2 = eps2;
        switch(ch) {
        case 1:
            return (left_op + right_op_1);
        case 2:
            return (left_op + right_op_2);
        default:
            return 0;
        }
    }
    

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

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

Параметр: -float-rounding-mode
Значение: to-nearest | all
Значение по умолчанию: to-nearest
Пример (программа автоматического доказательства кода): polyspace-code-prover -sources file_name -float-rounding-mode all
Пример (сервер программы автоматического доказательства кода): polyspace-code-prover-server -sources file_name -float-rounding-mode all

Введенный в R2016a