exponenta event banner

Режим округления с плавающей запятой (-float-rounding-mode)

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

Описание

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

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

Задать опцию

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

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

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

При проверке по умолчанию используется режим «округление до ближайшего».

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

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

Настройки

По умолчанию: to-nearest

to-nearest

Проверка предполагает режим «от круглой до ближайшей».

all

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

Совет

  • В анализе Polyspace используется арифметика с плавающей запятой, соответствующая стандарту IEEE ® 754. Например, арифметика использует команды с плавающей запятой, присутствующие в наборе команд SSE. Флаг GNU ® C -mfpmath=sse принудительно использует этот набор команд. При использовании компилятора GNU C с этим флагом для компиляции кода результаты анализа 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 для режима округления для учета двойного округления.

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

    Режим округления: to-nearestРежим округления: all

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

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

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

    #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;
        }
    }
    

    Помимо ближайшего режима, проверка переполнения также учитывает другие режимы округления.

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

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

    #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 и получите оранжевую проверку переполнения, чтобы определить, как может произойти переполнение, рассмотрим все режимы округления.

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

Параметр: -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