exponenta event banner

Float rounding mode (-float-rounding-mode)

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

Описание

Эта опция влияет только на анализ Code Prover.

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

Задать опцию

Пользовательский интерфейс (только для настольных продуктов): В строении проекта опция доступна на узле 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. GNU® Флаг C -mfpmath=sse обеспечивает принудительное использование этого набора команд. Если вы используете компилятор GNU C с этим флагом для компиляции кода, результаты анализа Polyspace согласуются с поведением во время выполнения.

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

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

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

    Режим округления: to-nearestРежим округления: 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
Пример (Code Prover): Polyspace Code Prover -sources file_name -float-rounding-mode all
Пример (Код Prover Server): Полипространство -code-prover-server -sources file_name -float-rounding-mode all
Введенный в R2016a