Переполнение плавающее

Переполнение от операции между плавающими точками

Описание

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

Точное выделение ресурсов хранения для различных типов с плавающей точкой зависит от вашего процессора. Смотрите Target processor type (-target).

Риск

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

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Используйте этот список событий, чтобы определить, как переменные в переполняющемся вычислении получают свои текущие значения. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, например, когда вы обрабатываете бесконечности в своем коде, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.

Примеры

развернуть все

#include <float.h>

float square(void) {

   float val = FLT_MAX;
   return val * val;  
}

В операторе возврата переменная val умножается отдельно. Квадрат максимального значения плавающего не может быть представлен плаванием (тип возврата для этой функции), потому что значение val является максимальным значением плавающим.

Исправление — различный тип хранения

Одно возможное исправление должно сохранить результат операции в большем типе данных. В этом примере, путем возврата double вместо float, фиксируется дефект переполнения.

#include <float.h>

double square(void) {
    float val = FLT_MAX;

    return (double)val * (double)val;  
}

Проверяйте информацию

Группа: числовой
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: FLOAT_OVFL
Влияние: низко
ID CWE: 189, 682, 873

Введенный в R2013b